home *** CD-ROM | disk | FTP | other *** search
/ Amiga Tools 4 / Amiga Tools 4.iso / tools / dfue / term 4.6(?) / extras / source / term-source.lha / ARexxAttributes.c < prev    next >
C/C++ Source or Header  |  1996-03-18  |  90KB  |  4,921 lines

  1. /*
  2. **    ARexxAttributes.c
  3. **
  4. **    ARexx interface attribute handling routines
  5. **
  6. **    Copyright © 1990-1996 by Olaf `Olsen' Barthel
  7. **        All Rights Reserved
  8. */
  9.  
  10. #ifndef _GLOBAL_H
  11. #include "Global.h"
  12. #endif
  13.  
  14.     /* ToBoolean(LONG Value):
  15.      *
  16.      *    Map an index value to a boolean string.
  17.      */
  18.  
  19. STATIC STRPTR
  20. ToBoolean(LONG Value)
  21. {
  22.     if(Value)
  23.         return("ON");
  24.     else
  25.         return("OFF");
  26. }
  27.  
  28.     /* FromBoolean(STRPTR Value):
  29.      *
  30.      *    Map a boolean value to an index value.
  31.      */
  32.  
  33. STATIC LONG
  34. FromBoolean(STRPTR Value)
  35. {
  36.     STATIC STRPTR BoolTrueMappings[] =
  37.     {
  38.         "TRUE",
  39.         "ON",
  40.         "YES",
  41.         "ENABLED",
  42.         "AVAILABLE",
  43.         NULL
  44.     };
  45.  
  46.     LONG i = 0;
  47.  
  48.     while(BoolTrueMappings[i])
  49.     {
  50.         if(!Stricmp(Value,BoolTrueMappings[i]))
  51.             return(TRUE);
  52.         else
  53.             i++;
  54.     }
  55.  
  56.     return(FALSE);
  57. }
  58.  
  59.     /* ToMap(LONG Index,STRPTR *Mappings):
  60.      *
  61.      *    Map an index to a string.
  62.      */
  63.  
  64. STATIC STRPTR
  65. ToMap(LONG Index,STRPTR *Mappings)
  66. {
  67.     LONG i = 0;
  68.  
  69.     while(Mappings[i])
  70.     {
  71.         if(Index == i)
  72.             return(Mappings[i]);
  73.         else
  74.             i++;
  75.     }
  76.  
  77.     return(Mappings[0]);
  78. }
  79.  
  80.     /* FromMap(STRPTR String,STRPTR *Mappings):
  81.      *
  82.      *    Map a string to an index number.
  83.      */
  84.  
  85. STATIC LONG
  86. FromMap(STRPTR String,STRPTR *Mappings)
  87. {
  88.     LONG i = 0;
  89.  
  90.     while(Mappings[i])
  91.     {
  92.         if(!Stricmp(String,Mappings[i]))
  93.             return(i);
  94.         else
  95.             i++;
  96.     }
  97.  
  98.     return(-1);
  99. }
  100.  
  101.     /* ToIndex(STRPTR Name,WORD *Count1,WORD *Count2):
  102.      *
  103.      *    Turn an index name into an index and count key.
  104.      */
  105.  
  106. STATIC LONG
  107. ToIndex(STRPTR Name,WORD *Count1,WORD *Count2)
  108. {
  109.     UBYTE    NodeName[40];
  110.     LONG    i,Level = 0,Top = 0,Index = -1;
  111.     BOOL    FoundIt = FALSE,
  112.         NodeIsNumeric;
  113.  
  114.         /* Reset counter variables. */
  115.  
  116.     *Count1 = *Count2 = -1;
  117.  
  118.         /* Skip leading blank spaces. */
  119.  
  120.     while(*Name == ' ' || *Name == '\t')
  121.         Name++;
  122.  
  123.         /* Scan until end of string found. */
  124.  
  125.     while(*Name)
  126.     {
  127.             /* Get the node name. */
  128.  
  129.         i = 0;
  130.  
  131.         while(*Name != '.' && *Name != ' ' && *Name != '\t' && *Name)
  132.             NodeName[i++] = *Name++;
  133.  
  134.         NodeName[i] = 0;
  135.  
  136.         DB(kprintf("node name is |%s|\n",NodeName));
  137.  
  138.             /* Is the name really a number? */
  139.  
  140.         NodeIsNumeric = IsNumeric(NodeName);
  141.  
  142.         DB(kprintf("node name numeric = %ld\n",NodeIsNumeric));
  143.  
  144.             /* Skip any trailing spaces. */
  145.  
  146.         while(*Name == ' ' || *Name == '\t')
  147.             Name++;
  148.  
  149.             /* Is a component name to follow? */
  150.  
  151.         if(*Name == '.')
  152.         {
  153.                 /* Skip dot and trailing spaces. */
  154.  
  155.             do
  156.                 Name++;
  157.             while(*Name == ' ' || *Name == '\t');
  158.         }
  159.         else
  160.             Name = "";    /* Last iteration. */
  161.  
  162.             /* Try to find the corresponding keyword in the tree. */
  163.  
  164.         FoundIt = FALSE;
  165.  
  166.         DB(kprintf("level is %ld\n",Level));
  167.  
  168.         for(i = Top ; i < AttributeTableSize ; i++)
  169.         {
  170.                 /* Is it on the same tree level? Note: code will
  171.                  * scan into the branches but will not move back up
  172.                  * in the tree.
  173.                  */
  174.  
  175.             if(AttributeTable[i] . Level == Level)
  176.             {
  177.                     /* Is a keyword required? */
  178.  
  179.                 if(AttributeTable[i] . Name)
  180.                 {
  181.                         /* Does the name match? */
  182.  
  183.                     if(!Stricmp(AttributeTable[i] . Name,NodeName))
  184.                     {
  185.                         DB(kprintf("matching name found\n"));
  186.  
  187.                             /* Remember new anchor point. */
  188.  
  189.                         Index    = i;
  190.                         Top    = i + 1;
  191.  
  192.                         FoundIt = TRUE;
  193.  
  194.                         break;
  195.                     }
  196.                 }
  197.                 else
  198.                 {
  199.                     DB(kprintf("no name given\n"));
  200.  
  201.                         /* Is the name really a number? */
  202.  
  203.                     if(NodeIsNumeric)
  204.                     {
  205.                             /* Store the counter. */
  206.  
  207.                         if(*Count1 == -1)
  208.                             *Count1 = Atol(NodeName);
  209.                         else
  210.                             *Count2 = Atol(NodeName);
  211.  
  212.                         DB(kprintf("using the entry; count1=%ld count2=%ld\n",*Count1,*Count2));
  213.  
  214.                             /* Remember new anchor point. */
  215.  
  216.                         Index    = i;
  217.                         Top    = i + 1;
  218.  
  219.                         FoundIt = TRUE;
  220.  
  221.                         break;
  222.                     }
  223.                 }
  224.             }
  225.             else
  226.             {
  227.                     /* Don't move back up in the tree! */
  228.  
  229.                 if(AttributeTable[i] . Level < Level)
  230.                     break;
  231.             }
  232.         }
  233.  
  234.         if(FoundIt)
  235.             Level++;
  236.         else
  237.             break;
  238.     }
  239.  
  240.         /* In case the last entry was found, return the index. */
  241.  
  242.     if(FoundIt)
  243.         return(Index);
  244.     else
  245.         return(-1);
  246. }
  247.  
  248.     /* FromIndex(LONG Index,LONG Count1,LONG Count2):
  249.      *
  250.      *    Turn an index/count key into a neat index name.
  251.      */
  252.  
  253. STATIC STRPTR
  254. FromIndex(LONG Index,LONG Count1,LONG Count2,BOOL IncludeRoot)
  255. {
  256.     STATIC UBYTE NameBuffer[160];
  257.  
  258.     LONG Levels[4],i;
  259.  
  260.         /* Reset the level indices. */
  261.  
  262.     for(i = 1 ; i < 4 ; i++)
  263.         Levels[i] = -1;
  264.  
  265.         /* Fill in the leaf level. */
  266.  
  267.     Levels[0] = Index;
  268.  
  269.         /* Top node? */
  270.  
  271.     if(Index > 0)
  272.     {
  273.         LONG Count = 1,Level = AttributeTable[Index] . Level;
  274.  
  275.             /* Move up in the tree. */
  276.  
  277.         for(i = Index - 1 ; i >= 0 ; i--)
  278.         {
  279.                 /* Previous level? */
  280.  
  281.             if(AttributeTable[i] . Level == Level - 1)
  282.             {
  283.                     /* Store index. */
  284.  
  285.                 Levels[Count++] = i;
  286.  
  287.                 Level--;
  288.             }
  289.         }
  290.     }
  291.  
  292.         /* Clear name buffer. */
  293.  
  294.     NameBuffer[0] = 0;
  295.  
  296.         /* Scan backwards. */
  297.  
  298.     for(i = 3 ; i >= 0 ; i--)
  299.     {
  300.             /* Valid level index? */
  301.  
  302.         if(Levels[i] != -1)
  303.         {
  304.                 /* First name? */
  305.  
  306.             if(!NameBuffer[0])
  307.                 strcpy(NameBuffer,AttributeTable[Levels[i]] . Name);
  308.             else
  309.             {
  310.                     /* Valid name string? */
  311.  
  312.                 if(AttributeTable[Levels[i]] . Name)
  313.                 {
  314.                     strcat(NameBuffer,".");
  315.                     strcat(NameBuffer,AttributeTable[Levels[i]] . Name);
  316.                 }
  317.                 else
  318.                 {
  319.                     UBYTE Number[20];
  320.  
  321.                         /* Add an index number. */
  322.  
  323.                     if(Count1 != -1)
  324.                     {
  325.                         SPrintf(Number,".%ld",Count1);
  326.  
  327.                         Count1 = -1;
  328.                     }
  329.                     else
  330.                         SPrintf(Number,".%ld",Count2);
  331.  
  332.                     strcat(NameBuffer,Number);
  333.                 }
  334.             }
  335.         }
  336.     }
  337.  
  338.         /* Return the name string. */
  339.  
  340.     if(IncludeRoot)
  341.         return(NameBuffer);
  342.     else
  343.     {
  344.         STRPTR Name = NameBuffer;
  345.  
  346.         while(*Name++ != '.');
  347.  
  348.         return(Name);
  349.     }
  350. }
  351.  
  352.     /* GetSingleAttribute(LONG ID,LONG Index,LONG Count1,STRPTR Input):
  353.      *
  354.      *    Beware the MONSTER!
  355.      */
  356.  
  357. STATIC LONG
  358. GetSingleAttribute(LONG ID,LONG Index,LONG Count1,STRPTR *Result)
  359. {
  360.     STATIC UBYTE ResultBuffer[MAXPUBSCREENNAME + 1];
  361.  
  362.     STRPTR    String;
  363.     LONG    Number,Error = 0;
  364.  
  365.     switch(ID)
  366.     {
  367.         case ATTR_APPLICATION_VERSION:
  368.  
  369.             SPrintf(ResultBuffer,"%ld.%ld",TermVersion,TermRevision);
  370.  
  371.             String = ResultBuffer;
  372.  
  373.             break;
  374.  
  375.         case ATTR_APPLICATION_SCREEN:
  376.  
  377.             if(GetPubScreenName(Window -> WScreen,ResultBuffer))
  378.                 String = ResultBuffer;
  379.             else
  380.                 Error = ERROR_OBJECT_NOT_FOUND;
  381.  
  382.             break;
  383.  
  384.         case ATTR_APPLICATION_SESSION_ONLINE:
  385.  
  386.             Number = Online;
  387.             break;
  388.  
  389.         case ATTR_APPLICATION_SESSION_SESSIONSTART:
  390.  
  391.             if(!FormatStamp(&SessionStart,NULL,NULL,ResultBuffer,FALSE))
  392.                 strcpy(ResultBuffer,"-");
  393.  
  394.             String = ResultBuffer;
  395.  
  396.             break;
  397.  
  398.         case ATTR_APPLICATION_SESSION_BYTESSENT:
  399.  
  400.             Number = BytesOut;
  401.             break;
  402.  
  403.         case ATTR_APPLICATION_SESSION_BYTESRECEIVED:
  404.  
  405.             Number = BytesIn;
  406.             break;
  407.  
  408.         case ATTR_APPLICATION_SESSION_CONNECTMESSAGE:
  409.  
  410.             String = BaudBuffer;
  411.             break;
  412.  
  413.         case ATTR_APPLICATION_SESSION_BBSNAME:
  414.  
  415.             String = CurrentBBSName;
  416.             break;
  417.  
  418.         case ATTR_APPLICATION_SESSION_BBSNUMBER:
  419.  
  420.             String = CurrentBBSNumber;
  421.             break;
  422.  
  423.         case ATTR_APPLICATION_SESSION_BBSCOMMENT:
  424.  
  425.             String = CurrentBBSComment;
  426.             break;
  427.  
  428.         case ATTR_APPLICATION_SESSION_USERNAME:
  429.  
  430.             String = UserName;
  431.             break;
  432.  
  433.         case ATTR_APPLICATION_SESSION_ONLINEMINUTES:
  434.  
  435.             Number = OnlineMinutes;
  436.             break;
  437.  
  438.         case ATTR_APPLICATION_SESSION_ONLINECOST:
  439.  
  440.             Number = (QueryAccountantCost() + 5000) / 10000;
  441.             break;
  442.  
  443.         case ATTR_APPLICATION_AREXX:
  444.  
  445.             String = RexxPortName;
  446.             break;
  447.  
  448.         case ATTR_APPLICATION_LASTERROR:
  449.  
  450.             Number = LastRexxError;
  451.             break;
  452.  
  453.         case ATTR_APPLICATION_TERMINAL_ROWS:
  454.  
  455.             if(XEmulatorBase && XEM_IO)
  456.             {
  457.                 if(XEmulatorBase -> lib_Version >= 4)
  458.                 {
  459.                     ULONG Result = XEmulatorInfo(XEM_IO,XEMI_CONSOLE_DIMENSIONS);
  460.  
  461.                     Number = XEMI_EXTRACT_LINES(Result);
  462.                 }
  463.                 else
  464.                     Number = 0;
  465.             }
  466.             else
  467.                 Number = LastLine + 1;
  468.  
  469.             break;
  470.  
  471.         case ATTR_APPLICATION_TERMINAL_COLUMNS:
  472.  
  473.             if(XEmulatorBase && XEM_IO)
  474.             {
  475.                 if(XEmulatorBase -> lib_Version >= 4)
  476.                 {
  477.                     ULONG Result = XEmulatorInfo(XEM_IO,XEMI_CONSOLE_DIMENSIONS);
  478.  
  479.                     Number = XEMI_EXTRACT_COLUMNS(Result);
  480.                 }
  481.                 else
  482.                     Number = 0;
  483.             }
  484.             else
  485.                 Number = LastColumn + 1;
  486.  
  487.             break;
  488.  
  489.         case ATTR_APPLICATION_BUFFER_SIZE:
  490.  
  491.             Number = BufferSpace;
  492.             break;
  493.  
  494.         case ATTR_PREFS_SERIAL_BAUDRATE:
  495.  
  496.             Number = Config -> SerialConfig -> BaudRate;
  497.             break;
  498.  
  499.         case ATTR_PREFS_SERIAL_USE_OWNDEVUNIT:
  500.  
  501.             Number = Config -> SerialConfig -> UseOwnDevUnit;
  502.             break;
  503.  
  504.         case ATTR_PREFS_SERIAL_DIRECT_CONNECTION:
  505.  
  506.             Number = Config -> SerialConfig -> DirectConnection;
  507.             break;
  508.  
  509.         case ATTR_PREFS_SERIAL_BREAKLENGTH:
  510.  
  511.             Number = Config -> SerialConfig -> BreakLength;
  512.             break;
  513.  
  514.         case ATTR_PREFS_SERIAL_BUFFERSIZE:
  515.  
  516.             Number = Config -> SerialConfig -> SerialBufferSize;
  517.             break;
  518.  
  519.         case ATTR_PREFS_SERIAL_QUANTUM:
  520.  
  521.             Number = Config -> SerialConfig -> Quantum;
  522.             break;
  523.  
  524.         case ATTR_PREFS_SERIAL_DEVICENAME:
  525.  
  526.             String = Config -> SerialConfig -> SerialDevice;
  527.             break;
  528.  
  529.         case ATTR_PREFS_SERIAL_UNIT:
  530.  
  531.             Number = Config -> SerialConfig -> UnitNumber;
  532.             break;
  533.  
  534.         case ATTR_PREFS_SERIAL_BITSPERCHAR:
  535.  
  536.             Number = Config -> SerialConfig -> BitsPerChar;
  537.             break;
  538.  
  539.         case ATTR_PREFS_SERIAL_PARITYMODE:
  540.  
  541.             Number = Config -> SerialConfig -> Parity;
  542.             break;
  543.  
  544.         case ATTR_PREFS_SERIAL_STOPBITS:
  545.  
  546.             Number = Config -> SerialConfig -> StopBits;
  547.             break;
  548.  
  549.         case ATTR_PREFS_SERIAL_HANDSHAKINGMODE:
  550.  
  551.             Number = Config -> SerialConfig -> HandshakingProtocol;
  552.             break;
  553.  
  554.         case ATTR_PREFS_SERIAL_DUPLEXMODE:
  555.  
  556.             Number = Config -> SerialConfig -> Duplex;
  557.             break;
  558.  
  559.         case ATTR_PREFS_SERIAL_XONXOFF:
  560.  
  561.             Number = Config -> SerialConfig -> xONxOFF;
  562.             break;
  563.  
  564.         case ATTR_PREFS_SERIAL_HIGHSPEED:
  565.  
  566.             Number = Config -> SerialConfig -> HighSpeed;
  567.             break;
  568.  
  569.         case ATTR_PREFS_SERIAL_SHARED:
  570.  
  571.             Number = Config -> SerialConfig -> Shared;
  572.             break;
  573.  
  574.         case ATTR_PREFS_SERIAL_STRIPBIT8:
  575.  
  576.             Number = Config -> SerialConfig -> StripBit8;
  577.             break;
  578.  
  579.         case ATTR_PREFS_SERIAL_CARRIERCHECK:
  580.  
  581.             Number = Config -> SerialConfig -> CheckCarrier;
  582.             break;
  583.  
  584.         case ATTR_PREFS_SERIAL_PASSXONXOFFTHROUGH:
  585.  
  586.             Number = Config -> SerialConfig -> PassThrough;
  587.             break;
  588.  
  589.         case ATTR_PREFS_SERIAL_OWNDEVUNIT_REQUEST:
  590.  
  591.             Number = Config -> SerialConfig -> SatisfyODURequests;
  592.             break;
  593.  
  594.         case ATTR_PREFS_MODEM_DIAL_MODE:
  595.  
  596.             Number = Config -> ModemConfig -> DialMode;
  597.             break;
  598.  
  599.         case ATTR_PREFS_MODEM_PBX_MODE:
  600.  
  601.             Number = Config -> ModemConfig -> PBX_Mode;
  602.             break;
  603.  
  604.         case ATTR_PREFS_MODEM_DO_NOT_SEND_COMMANDS:
  605.  
  606.             Number = Config -> ModemConfig -> DoNotSendMainModemCommands;
  607.             break;
  608.  
  609.         case ATTR_PREFS_MODEM_CHAR_SEND_DELAY:
  610.  
  611.             Number = Config -> ModemConfig -> CharSendDelay;
  612.             break;
  613.  
  614.         case ATTR_PREFS_MODEM_MODEMINITTEXT:
  615.  
  616.             String = Config -> ModemConfig -> ModemInit;
  617.             break;
  618.  
  619.         case ATTR_PREFS_MODEM_PBX_PREFIX:
  620.  
  621.             String = Config -> ModemConfig -> PBX_Prefix;
  622.             break;
  623.  
  624.         case ATTR_PREFS_MODEM_MODEMEXITTEXT:
  625.  
  626.             String = Config -> ModemConfig -> ModemExit;
  627.             break;
  628.  
  629.         case ATTR_PREFS_MODEM_MODEMHANGUPTEXT:
  630.  
  631.             String = Config -> ModemConfig -> ModemHangup;
  632.             break;
  633.  
  634.         case ATTR_PREFS_MODEM_DIALPREFIXTEXT:
  635.  
  636.             String = Config -> ModemConfig -> DialPrefix;
  637.             break;
  638.  
  639.         case ATTR_PREFS_MODEM_DIALSUFFIXTEXT:
  640.  
  641.             String = Config -> ModemConfig -> DialSuffix;
  642.             break;
  643.  
  644.         case ATTR_PREFS_MODEM_NOCARRIERTEXT:
  645.  
  646.             String = Config -> ModemConfig -> NoCarrier;
  647.             break;
  648.  
  649.         case ATTR_PREFS_MODEM_NODIALTONETEXT:
  650.  
  651.             String = Config -> ModemConfig -> NoDialTone;
  652.             break;
  653.  
  654.         case ATTR_PREFS_MODEM_CONNECTTEXT:
  655.  
  656.             String = Config -> ModemConfig -> Connect;
  657.             break;
  658.  
  659.         case ATTR_PREFS_MODEM_VOICETEXT:
  660.  
  661.             String = Config -> ModemConfig -> Voice;
  662.             break;
  663.  
  664.         case ATTR_PREFS_MODEM_RINGTEXT:
  665.  
  666.             String = Config -> ModemConfig -> Ring;
  667.             break;
  668.  
  669.         case ATTR_PREFS_MODEM_BUSYTEXT:
  670.  
  671.             String = Config -> ModemConfig -> Busy;
  672.             break;
  673.  
  674.         case ATTR_PREFS_MODEM_OKTEXT:
  675.  
  676.             String = Config -> ModemConfig -> Ok;
  677.             break;
  678.  
  679.         case ATTR_PREFS_MODEM_ERRORTEXT:
  680.  
  681.             String = Config -> ModemConfig -> Error;
  682.             break;
  683.  
  684.         case ATTR_PREFS_MODEM_REDIALDELAY:
  685.  
  686.             Number = Config -> ModemConfig -> RedialDelay;
  687.             break;
  688.  
  689.         case ATTR_PREFS_MODEM_DIALRETRIES:
  690.  
  691.             Number = Config -> ModemConfig -> DialRetries;
  692.             break;
  693.  
  694.         case ATTR_PREFS_MODEM_DIALTIMEOUT:
  695.  
  696.             Number = Config -> ModemConfig -> DialTimeout;
  697.             break;
  698.  
  699.         case ATTR_PREFS_MODEM_INTER_DIAL_DELAY:
  700.  
  701.             Number = Config -> ModemConfig -> InterDialDelay;
  702.             break;
  703.  
  704.         case ATTR_PREFS_MODEM_CONNECTAUTOBAUD:
  705.  
  706.             Number = Config -> ModemConfig -> ConnectAutoBaud;
  707.             break;
  708.  
  709.         case ATTR_PREFS_MODEM_HANGUPDROPSDTR:
  710.  
  711.             Number = Config -> ModemConfig -> DropDTR;
  712.             break;
  713.  
  714.         case ATTR_PREFS_MODEM_REDIALAFTERHANGUP:
  715.  
  716.             Number = Config -> ModemConfig -> RedialAfterHangup;
  717.             break;
  718.  
  719.         case ATTR_PREFS_MODEM_VERBOSEDIALING:
  720.  
  721.             Number = Config -> ModemConfig -> VerboseDialing;
  722.             break;
  723.  
  724.         case ATTR_PREFS_MODEM_NOCARRIERISBUSY:
  725.  
  726.             Number = Config -> ModemConfig -> NoCarrierIsBusy;
  727.             break;
  728.  
  729.         case ATTR_PREFS_MODEM_CONNECTLIMIT:
  730.  
  731.             Number = Config -> ModemConfig -> ConnectLimit;
  732.             break;
  733.  
  734.         case ATTR_PREFS_MODEM_CONNECTLIMITMACRO:
  735.  
  736.             String = Config -> ModemConfig -> ConnectLimitMacro;
  737.             break;
  738.  
  739.         case ATTR_PREFS_SERIAL_RELEASE_WHEN_ONLINE:
  740.  
  741.             Number = Config -> SerialConfig -> ReleaseODUWhenOnline;
  742.             break;
  743.  
  744.         case ATTR_PREFS_SERIAL_RELEASE_WHEN_DIALING:
  745.  
  746.             Number = Config -> SerialConfig -> ReleaseODUWhenDialing;
  747.             break;
  748.  
  749.         case ATTR_PREFS_SERIAL_NO_ODU_IF_SHARED:
  750.  
  751.             Number = Config -> SerialConfig -> NoODUIfShared;
  752.             break;
  753.  
  754.         case ATTR_PREFS_SERIAL_LOCAL_ECHO:
  755.  
  756.             Number = Config -> SerialConfig -> Duplex;
  757.             break;
  758.  
  759.         case ATTR_PREFS_MODEM_TIME_TO_CONNECT:
  760.  
  761.             Number = Config -> ModemConfig -> TimeToConnect;
  762.             break;
  763.  
  764.         case ATTR_PREFS_COMMANDS_STARTUPMACROTEXT:
  765.  
  766.             String = Config -> CommandConfig -> StartupMacro;
  767.             break;
  768.  
  769.         case ATTR_PREFS_COMMANDS_LOGINMACROTEXT:
  770.  
  771.             String = Config -> CommandConfig -> LoginMacro;
  772.             break;
  773.  
  774.         case ATTR_PREFS_COMMANDS_LOGOFFMACROTEXT:
  775.  
  776.             String = Config -> CommandConfig -> LogoffMacro;
  777.             break;
  778.  
  779.         case ATTR_PREFS_COMMANDS_UPLOADMACROTEXT:
  780.  
  781.             String = Config -> CommandConfig -> UploadMacro;
  782.             break;
  783.  
  784.         case ATTR_PREFS_COMMANDS_DOWNLOADMACROTEXT:
  785.  
  786.             String = Config -> CommandConfig -> DownloadMacro;
  787.             break;
  788.  
  789.         case ATTR_PREFS_SCREEN_COLOURMODE:
  790.  
  791.             Number = Config -> ScreenConfig -> ColourMode;
  792.             break;
  793.  
  794.         case ATTR_PREFS_SCREEN_USEPENS:
  795.  
  796.             Number = Config -> ScreenConfig -> UsePens;
  797.             break;
  798.  
  799.         case ATTR_PREFS_SCREEN_WINDOW_BORDER:
  800.  
  801.             Number = Config -> ScreenConfig -> ShareScreen;
  802.             break;
  803.  
  804.         case ATTR_PREFS_SCREEN_SPLIT_STATUS:
  805.  
  806.             Number = Config -> ScreenConfig -> SplitStatus;
  807.             break;
  808.  
  809.         case ATTR_PREFS_SCREEN_FONTNAME:
  810.  
  811.             String = Config -> ScreenConfig -> FontName;
  812.             break;
  813.  
  814.         case ATTR_PREFS_SCREEN_FONTSIZE:
  815.  
  816.             Number = Config -> ScreenConfig -> FontHeight;
  817.             break;
  818.  
  819.         case ATTR_PREFS_SCREEN_MAKESCREENPUBLIC:
  820.  
  821.             Number = Config -> ScreenConfig -> MakeScreenPublic;
  822.             break;
  823.  
  824.         case ATTR_PREFS_SCREEN_SHANGHAIWINDOWS:
  825.  
  826.             Number = Config -> ScreenConfig -> ShanghaiWindows;
  827.             break;
  828.  
  829.         case ATTR_PREFS_SCREEN_BLINKING:
  830.  
  831.             Number = Config -> ScreenConfig -> Blinking;
  832.             break;
  833.  
  834.         case ATTR_PREFS_SCREEN_FASTERLAYOUT:
  835.  
  836.             Number = Config -> ScreenConfig -> FasterLayout;
  837.             break;
  838.  
  839.         case ATTR_PREFS_SCREEN_TITLEBAR:
  840.  
  841.             Number = Config -> ScreenConfig -> TitleBar;
  842.             break;
  843.  
  844.         case ATTR_PREFS_SCREEN_STATUSLINEMODE:
  845.  
  846.             Number = Config -> ScreenConfig -> StatusLine;
  847.             break;
  848.  
  849.         case ATTR_PREFS_SCREEN_USEWORKBENCH:
  850.  
  851.             Number = Config -> ScreenConfig -> UseWorkbench;
  852.             break;
  853.  
  854.         case ATTR_PREFS_SCREEN_PUBSCREENNAME:
  855.  
  856.             String = Config -> ScreenConfig -> PubScreenName;
  857.             break;
  858.  
  859.         case ATTR_PREFS_SCREEN_ONLINEDISPLAY:
  860.  
  861.             Number = Config -> ScreenConfig -> TimeMode;
  862.             break;
  863.  
  864.         case ATTR_PREFS_TERMINAL_BELLMODE:
  865.  
  866.             Number = Config -> TerminalConfig -> BellMode;
  867.             break;
  868.  
  869.         case ATTR_PREFS_TERMINAL_USETERMINALPROCESS:
  870.  
  871.             Number = Config -> TerminalConfig -> UseTerminalTask;
  872.             break;
  873.  
  874.         case ATTR_PREFS_TERMINAL_AUTOSIZE:
  875.  
  876.             Number = Config -> TerminalConfig -> AutoSize;
  877.             break;
  878.  
  879.         case ATTR_PREFS_TERMINAL_EMULATIONMODE:
  880.  
  881.             Number = Config -> TerminalConfig -> EmulationMode;
  882.             break;
  883.  
  884.         case ATTR_PREFS_TERMINAL_FONTMODE:
  885.  
  886.             Number = Config -> TerminalConfig -> FontMode;
  887.             break;
  888.  
  889.         case ATTR_PREFS_TERMINAL_SENDCRMODE:
  890.  
  891.             Number = Config -> TerminalConfig -> SendCR;
  892.             break;
  893.  
  894.         case ATTR_PREFS_TERMINAL_SENDLFMODE:
  895.  
  896.             Number = Config -> TerminalConfig -> SendLF;
  897.             break;
  898.  
  899.         case ATTR_PREFS_TERMINAL_RECEIVECRMODE:
  900.  
  901.             Number = Config -> TerminalConfig -> ReceiveCR;
  902.             break;
  903.  
  904.         case ATTR_PREFS_TERMINAL_RECEIVELFMODE:
  905.  
  906.             Number = Config -> TerminalConfig -> ReceiveLF;
  907.             break;
  908.  
  909.         case ATTR_PREFS_TERMINAL_NUMCOLUMNS:
  910.  
  911.             Number = Config -> TerminalConfig -> NumColumns;
  912.             break;
  913.  
  914.         case ATTR_PREFS_TERMINAL_NUMLINES:
  915.  
  916.             Number = Config -> TerminalConfig -> NumLines;
  917.             break;
  918.  
  919.         case ATTR_PREFS_TERMINAL_KEYMAPNAME:
  920.  
  921.             String = Config -> TerminalConfig -> KeyMapFileName;
  922.             break;
  923.  
  924.         case ATTR_PREFS_TERMINAL_EMULATIONNAME:
  925.  
  926.             String = Config -> TerminalConfig -> EmulationFileName;
  927.             break;
  928.  
  929.         case ATTR_PREFS_TERMINAL_FONTNAME:
  930.  
  931.             String = Config -> TerminalConfig -> TextFontName;
  932.             break;
  933.  
  934.         case ATTR_PREFS_TERMINAL_FONTSIZE:
  935.  
  936.             Number = Config -> TerminalConfig -> TextFontHeight;
  937.             break;
  938.  
  939.         case ATTR_PREFS_PATHS_ASCIIUPLOADPATH:
  940.  
  941.             String = Config -> PathConfig -> ASCIIUploadPath;
  942.             break;
  943.  
  944.         case ATTR_PREFS_PATHS_ASCIIDOWNLOADPATH:
  945.  
  946.             String = Config -> PathConfig -> ASCIIDownloadPath;
  947.             break;
  948.  
  949.         case ATTR_PREFS_PATHS_TEXTUPLOADPATH:
  950.  
  951.             String = Config -> PathConfig -> TextUploadPath;
  952.             break;
  953.  
  954.         case ATTR_PREFS_PATHS_TEXTDOWNLOADPATH:
  955.  
  956.             String = Config -> PathConfig -> TextDownloadPath;
  957.             break;
  958.  
  959.         case ATTR_PREFS_PATHS_BINARYUPLOADPATH:
  960.  
  961.             String = Config -> PathConfig -> BinaryUploadPath;
  962.             break;
  963.  
  964.         case ATTR_PREFS_PATHS_BINARYDOWNLOADPATH:
  965.  
  966.             String = Config -> PathConfig -> BinaryDownloadPath;
  967.             break;
  968.  
  969.         case ATTR_PREFS_PATHS_CONFIGPATH:
  970.  
  971.             String = Config -> PathConfig -> DefaultStorage;
  972.             break;
  973.  
  974.         case ATTR_PREFS_PATHS_EDITORNAME:
  975.  
  976.             String = Config -> PathConfig -> Editor;
  977.             break;
  978.  
  979.         case ATTR_PREFS_PATHS_HELPFILENAME:
  980.  
  981.             String = Config -> PathConfig -> HelpFile;
  982.             break;
  983.  
  984.         case ATTR_PREFS_MISC_ALERTMODE:
  985.  
  986.             Number = Config -> MiscConfig -> AlertMode;
  987.             break;
  988.  
  989.         case ATTR_PREFS_MISC_WAITSTRING:
  990.  
  991.             String = Config -> MiscConfig -> WaitString;
  992.             break;
  993.  
  994.         case ATTR_PREFS_MISC_WAITDELAY:
  995.  
  996.             Number = Config -> MiscConfig -> WaitDelay;
  997.             break;
  998.  
  999.         case ATTR_PREFS_MISC_REQUESTERMODE:
  1000.  
  1001.             Number = Config -> MiscConfig -> RequesterMode;
  1002.             break;
  1003.  
  1004.         case ATTR_PREFS_MISC_REQUESTERWIDTH:
  1005.  
  1006.             Number = Config -> MiscConfig -> RequesterWidth;
  1007.             break;
  1008.  
  1009.         case ATTR_PREFS_MISC_REQUESTERHEIGHT:
  1010.  
  1011.             Number = Config -> MiscConfig -> RequesterHeight;
  1012.             break;
  1013.  
  1014.         case ATTR_PREFS_MISC_IOBUFFERSIZE:
  1015.  
  1016.             Number = Config -> MiscConfig -> IOBufferSize;
  1017.             break;
  1018.  
  1019.         case ATTR_PREFS_MISC_PRIORITY:
  1020.  
  1021.             Number = Config -> MiscConfig -> Priority;
  1022.             break;
  1023.  
  1024.         case ATTR_PREFS_MISC_BACKUPCONFIG:
  1025.  
  1026.             Number = Config -> MiscConfig -> BackupConfig;
  1027.             break;
  1028.  
  1029.         case ATTR_PREFS_MISC_OVERWRITE_WARNING:
  1030.  
  1031.             Number = Config -> MiscConfig -> ProtectiveMode;
  1032.             break;
  1033.  
  1034.         case ATTR_PREFS_MISC_OPENFASTMACROPANEL:
  1035.  
  1036.             Number = Config -> MiscConfig -> OpenFastMacroPanel;
  1037.             break;
  1038.  
  1039.         case ATTR_PREFS_MISC_RELEASEDEVICE:
  1040.  
  1041.             Number = Config -> MiscConfig -> ReleaseDevice;
  1042.             break;
  1043.  
  1044.         case ATTR_PREFS_MISC_OVERRIDEPATH:
  1045.         case ATTR_PREFS_TRANSFER_OVERRIDEPATH:
  1046.  
  1047.             Number = Config -> TransferConfig -> OverridePath;
  1048.             break;
  1049.  
  1050.         case ATTR_PREFS_MISC_AUTOUPLOAD:
  1051.  
  1052.             Number = Config -> MiscConfig -> AutoUpload;
  1053.             break;
  1054.  
  1055.         case ATTR_PREFS_MISC_SETARCHIVEDBIT:
  1056.         case ATTR_PREFS_TRANSFER_SETARCHIVEDBIT:
  1057.  
  1058.             Number = Config -> TransferConfig -> SetArchivedBit;
  1059.             break;
  1060.  
  1061.         case ATTR_PREFS_TRANSFER_COMMENTMODE:
  1062.         case ATTR_PREFS_MISC_COMMENTMODE:
  1063.  
  1064.             Number = Config -> TransferConfig -> IdentifyFiles;
  1065.             break;
  1066.  
  1067.         case ATTR_PREFS_MISC_TRANSFERICONS:
  1068.         case ATTR_PREFS_TRANSFER_TRANSFERICONS:
  1069.  
  1070.             Number = Config -> TransferConfig -> TransferIcons;
  1071.             break;
  1072.  
  1073.         case ATTR_PREFS_MISC_CREATEICONS:
  1074.  
  1075.             Number = Config -> MiscConfig -> CreateIcons;
  1076.             break;
  1077.  
  1078.         case ATTR_PREFS_MISC_SIMPLEIO:
  1079.  
  1080.             Number = Config -> MiscConfig -> SimpleIO;
  1081.             break;
  1082.  
  1083.         case ATTR_PREFS_MISC_HIDE_UPLOAD_ICON:
  1084.         case ATTR_PREFS_TRANSFER_HIDE_UPLOAD_ICON:
  1085.  
  1086.             Number = Config -> TransferConfig -> HideUploadIcon;
  1087.             break;
  1088.  
  1089.         case ATTR_PREFS_MISC_TRANSFER_PERFMETER:
  1090.         case ATTR_PREFS_TRANSFER_TRANSFER_PERFMETER:
  1091.  
  1092.             Number = Config -> TransferConfig -> PerfMeter;
  1093.             break;
  1094.  
  1095.         case ATTR_PREFS_CLIPBOARD_UNIT:
  1096.  
  1097.             Number = Config -> ClipConfig -> ClipboardUnit;
  1098.             break;
  1099.  
  1100.         case ATTR_PREFS_CLIPBOARD_LINEDELAY:
  1101.  
  1102.             Number = Config -> ClipConfig -> LineDelay;
  1103.             break;
  1104.  
  1105.         case ATTR_PREFS_CLIPBOARD_CHARDELAY:
  1106.  
  1107.             Number = Config -> ClipConfig -> CharDelay;
  1108.             break;
  1109.  
  1110.         case ATTR_PREFS_CLIPBOARD_INSERTPREFIXTEXT:
  1111.  
  1112.             String = Config -> ClipConfig -> InsertPrefix;
  1113.             break;
  1114.  
  1115.         case ATTR_PREFS_CLIPBOARD_INSERTSUFFIXTEXT:
  1116.  
  1117.             String = Config -> ClipConfig -> InsertSuffix;
  1118.             break;
  1119.  
  1120.         case ATTR_PREFS_CLIPBOARD_LINEPROMPT:
  1121.  
  1122.             String = Config -> ClipConfig -> LinePrompt;
  1123.             break;
  1124.  
  1125.         case ATTR_PREFS_CLIPBOARD_TEXTPACING:
  1126.  
  1127.             Number = Config -> ClipConfig -> PacingMode;
  1128.             break;
  1129.  
  1130.         case ATTR_PREFS_CLIPBOARD_SENDTIMEOUT:
  1131.  
  1132.             Number = Config -> ClipConfig -> SendTimeout;
  1133.             break;
  1134.  
  1135.         case ATTR_PREFS_CLIPBOARD_CONVERTLF:
  1136.  
  1137.             Number = Config -> ClipConfig -> ConvertLF;
  1138.             break;
  1139.  
  1140.         case ATTR_PREFS_CAPTURE_CONVERTCHARACTERS:
  1141.  
  1142.             Number = Config -> CaptureConfig -> ConvertChars;
  1143.             break;
  1144.  
  1145.         case ATTR_PREFS_CAPTURE_BUFFERMODE:
  1146.  
  1147.             Number = Config -> CaptureConfig -> BufferMode;
  1148.             break;
  1149.  
  1150.         case ATTR_PREFS_CAPTURE_LOGACTIONS:
  1151.  
  1152.             Number = Config -> CaptureConfig -> LogActions;
  1153.             break;
  1154.  
  1155.         case ATTR_PREFS_CAPTURE_LOGCALLS:
  1156.  
  1157.             Number = Config -> CaptureConfig -> LogCall;
  1158.             break;
  1159.  
  1160.         case ATTR_PREFS_CAPTURE_LOGFILENAME:
  1161.  
  1162.             String = Config -> CaptureConfig -> LogFileName;
  1163.             break;
  1164.  
  1165.         case ATTR_PREFS_CAPTURE_MAXBUFFERSIZE:
  1166.  
  1167.             Number = Config -> CaptureConfig -> MaxBufferSize;
  1168.             break;
  1169.  
  1170.         case ATTR_PREFS_CAPTURE_BUFFER:
  1171.  
  1172.             Number = Config -> CaptureConfig -> BufferEnabled;
  1173.             break;
  1174.  
  1175.         case ATTR_PREFS_CAPTURE_CONNECTAUTOCAPTURE:
  1176.  
  1177.             Number = Config -> CaptureConfig -> ConnectAutoCapture;
  1178.             break;
  1179.  
  1180.         case ATTR_PREFS_CAPTURE_AUTOCAPTUREDATE:
  1181.  
  1182.             Number = Config -> CaptureConfig -> AutoCaptureDate;
  1183.             break;
  1184.  
  1185.         case ATTR_PREFS_CAPTURE_CAPTUREFILTER:
  1186.  
  1187.             Number = Config -> CaptureConfig -> CaptureFilterMode;
  1188.             break;
  1189.  
  1190.         case ATTR_PREFS_CAPTURE_CAPTUREPATH:
  1191.  
  1192.             String = Config -> CaptureConfig -> CapturePath;
  1193.             break;
  1194.  
  1195.         case ATTR_PREFS_CAPTURE_CALLLOGFILENAME:
  1196.  
  1197.             String = Config -> CaptureConfig -> CallLogFileName;
  1198.             break;
  1199.  
  1200.         case ATTR_PREFS_CAPTURE_BUFFERSAVEPATH:
  1201.  
  1202.             String = Config -> CaptureConfig -> BufferPath;
  1203.             break;
  1204.  
  1205.         case ATTR_PREFS_CAPTURE_OPENBUFFERWINDOW:
  1206.  
  1207.             Number = Config -> CaptureConfig -> OpenBufferWindow;
  1208.             break;
  1209.  
  1210.         case ATTR_PREFS_CAPTURE_OPENBUFFERSCREEN:
  1211.  
  1212.             Number = Config -> CaptureConfig -> OpenBufferScreen;
  1213.             break;
  1214.  
  1215.         case ATTR_PREFS_CAPTURE_BUFFERSCREENPOSITION:
  1216.  
  1217.             Number = Config -> CaptureConfig -> BufferScreenPosition;
  1218.             break;
  1219.  
  1220.         case ATTR_PREFS_CAPTURE_BUFFERWIDTH:
  1221.  
  1222.             Number = Config -> CaptureConfig -> BufferWidth;
  1223.             break;
  1224.  
  1225.         case ATTR_PREFS_CAPTURE_SEARCH_HISTORY:
  1226.  
  1227.             Number = Config -> CaptureConfig -> SearchHistory;
  1228.             break;
  1229.  
  1230.         case ATTR_PREFS_CAPTURE_REMEMBER_BUFFERWINDOW:
  1231.  
  1232.             Number = Config -> CaptureConfig -> RememberBufferWindow;
  1233.             break;
  1234.  
  1235.         case ATTR_PREFS_CAPTURE_REMEMBER_BUFFERSCREEN:
  1236.  
  1237.             Number = Config -> CaptureConfig -> RememberBufferScreen;
  1238.             break;
  1239.  
  1240.         case ATTR_PREFS_FILE_TRANSFERPROTOCOLNAME:
  1241.  
  1242.             String = Config -> TransferConfig -> DefaultLibrary;
  1243.             break;
  1244.  
  1245.         case ATTR_PREFS_FILE_TRANSLATIONFILENAME:
  1246.  
  1247.             String = Config -> TranslationFileName;
  1248.             break;
  1249.  
  1250.         case ATTR_PREFS_FILE_MACROFILENAME:
  1251.  
  1252.             String = Config -> MacroFileName;
  1253.             break;
  1254.  
  1255.         case ATTR_PREFS_FILE_CURSORFILENAME:
  1256.  
  1257.             String = Config -> CursorFileName;
  1258.             break;
  1259.  
  1260.         case ATTR_PREFS_FILE_FASTMACROFILENAME:
  1261.  
  1262.             String = Config -> FastMacroFileName;
  1263.             break;
  1264.  
  1265.         case ATTR_PREFS_EMULATION_IDENTIFICATION:
  1266.  
  1267.             Number = Config -> EmulationConfig -> TerminalType;
  1268.             break;
  1269.  
  1270.         case ATTR_PREFS_EMULATION_STYLELOCKED:
  1271.  
  1272.             Number = Config -> EmulationConfig -> LockStyle;
  1273.             break;
  1274.  
  1275.         case ATTR_PREFS_EMULATION_USEPENS:
  1276.  
  1277.             Number = Config -> EmulationConfig -> UseStandardPens;
  1278.             break;
  1279.  
  1280.         case ATTR_PREFS_EMULATION_COLOURLOCKED:
  1281.  
  1282.             Number = Config -> EmulationConfig -> LockColour;
  1283.             break;
  1284.  
  1285.         case ATTR_PREFS_EMULATION_CURSORMODE:
  1286.  
  1287.             Number = Config -> EmulationConfig -> CursorMode;
  1288.             break;
  1289.  
  1290.         case ATTR_PREFS_EMULATION_CURSORLOCKED:
  1291.  
  1292.             Number = Config -> EmulationConfig -> CursorLocked;
  1293.             break;
  1294.  
  1295.         case ATTR_PREFS_EMULATION_FONTLOCKED:
  1296.  
  1297.             Number = Config -> EmulationConfig -> FontLocked;
  1298.             break;
  1299.  
  1300.         case ATTR_PREFS_EMULATION_NUMPADLOCKED:
  1301.  
  1302.             Number = Config -> EmulationConfig -> KeysLocked;
  1303.             break;
  1304.  
  1305.         case ATTR_PREFS_EMULATION_WRAPLOCKED:
  1306.  
  1307.             Number = Config -> EmulationConfig -> LockWrapping;
  1308.             break;
  1309.  
  1310.         case ATTR_PREFS_EMULATION_NUMERICMODE:
  1311.  
  1312.             Number = Config -> EmulationConfig -> NumericMode;
  1313.             break;
  1314.  
  1315.         case ATTR_PREFS_EMULATION_CURSORWRAP:
  1316.  
  1317.             Number = Config -> EmulationConfig -> CursorWrap;
  1318.             break;
  1319.  
  1320.         case ATTR_PREFS_EMULATION_LINEWRAP:
  1321.  
  1322.             Number = Config -> EmulationConfig -> LineWrap;
  1323.             break;
  1324.  
  1325.         case ATTR_PREFS_EMULATION_INSERTMODE:
  1326.  
  1327.             Number = Config -> EmulationConfig -> InsertMode;
  1328.             break;
  1329.  
  1330.         case ATTR_PREFS_EMULATION_NEWLINEMODE:
  1331.  
  1332.             Number = Config -> EmulationConfig -> NewLineMode;
  1333.             break;
  1334.  
  1335.         case ATTR_PREFS_EMULATION_SCROLLMODE:
  1336.  
  1337.             Number = Config -> EmulationConfig -> ScrollMode;
  1338.             break;
  1339.  
  1340.         case ATTR_PREFS_EMULATION_DESTRUCTIVEBACKSPACE:
  1341.  
  1342.             Number = Config -> EmulationConfig -> DestructiveBackspace;
  1343.             break;
  1344.  
  1345.         case ATTR_PREFS_EMULATION_SWAPBSDELETE:
  1346.  
  1347.             Number = Config -> EmulationConfig -> SwapBSDelete;
  1348.             break;
  1349.  
  1350.         case ATTR_PREFS_EMULATION_PRINTERENABLED:
  1351.  
  1352.             Number = Config -> EmulationConfig -> PrinterEnabled;
  1353.             break;
  1354.  
  1355.         case ATTR_PREFS_EMULATION_ANSWERBACKTEXT:
  1356.  
  1357.             String = Config -> EmulationConfig -> AnswerBack;
  1358.             break;
  1359.  
  1360.         case ATTR_PREFS_EMULATION_CLS_RESETS_CURSOR:
  1361.  
  1362.             Number = Config -> EmulationConfig -> CLSResetsCursor;
  1363.             break;
  1364.  
  1365.         case ATTR_PREFS_EMULATION_MAXSCROLL:
  1366.  
  1367.             Number = Config -> EmulationConfig -> MaxScroll;
  1368.             break;
  1369.  
  1370.         case ATTR_PREFS_EMULATION_MAXJUMP:
  1371.  
  1372.             Number = Config -> EmulationConfig -> MaxJump;
  1373.             break;
  1374.  
  1375.         case ATTR_PREFS_TRANSFER_DEFAULT_LIBRARY:
  1376.  
  1377.             String = Config -> TransferConfig -> DefaultLibrary;
  1378.             break;
  1379.  
  1380.         case ATTR_PREFS_TRANSFER_ASCII_UPLOAD_LIBRARY:
  1381.  
  1382.             String = Config -> TransferConfig -> ASCIIUploadLibrary;
  1383.             break;
  1384.  
  1385.         case ATTR_PREFS_TRANSFER_ASCII_DOWNLOAD_LIBRARY:
  1386.  
  1387.             String = Config -> TransferConfig -> ASCIIDownloadLibrary;
  1388.             break;
  1389.  
  1390.         case ATTR_PREFS_TRANSFER_TEXT_UPLOAD_LIBRARY:
  1391.  
  1392.             String = Config -> TransferConfig -> TextUploadLibrary;
  1393.             break;
  1394.  
  1395.         case ATTR_PREFS_TRANSFER_TEXT_DOWNLOAD_LIBRARY:
  1396.  
  1397.             String = Config -> TransferConfig -> TextDownloadLibrary;
  1398.             break;
  1399.  
  1400.         case ATTR_PREFS_TRANSFER_BINARY_UPLOAD_LIBRARY:
  1401.  
  1402.             String = Config -> TransferConfig -> BinaryUploadLibrary;
  1403.             break;
  1404.  
  1405.         case ATTR_PREFS_TRANSFER_BINARY_DOWNLOAD_LIBRARY:
  1406.  
  1407.             String = Config -> TransferConfig -> BinaryDownloadLibrary;
  1408.             break;
  1409.  
  1410.         case ATTR_PREFS_TRANSFER_INTERNAL_ASCII_DOWNLOAD:
  1411.  
  1412.             Number = Config -> TransferConfig -> InternalASCIIDownload;
  1413.             break;
  1414.  
  1415.         case ATTR_PREFS_TRANSFER_INTERNAL_ASCII_UPLOAD:
  1416.  
  1417.             Number = Config -> TransferConfig -> InternalASCIIUpload;
  1418.             break;
  1419.  
  1420.         case ATTR_PREFS_TRANSFER_QUIET_TRANSFER:
  1421.  
  1422.             Number = Config -> TransferConfig -> QuietTransfer;
  1423.             break;
  1424.  
  1425.         case ATTR_PREFS_TRANSFER_MANGLE_FILE_NAMES:
  1426.  
  1427.             Number = Config -> TransferConfig -> MangleFileNames;
  1428.             break;
  1429.  
  1430.         case ATTR_PREFS_TRANSFER_STRIP_BIT_8:
  1431.  
  1432.             Number = Config -> TransferConfig -> StripBit8;
  1433.             break;
  1434.  
  1435.         case ATTR_PREFS_TRANSFER_IGNORE_DATA_PAST_ARNOLD:
  1436.  
  1437.             Number = Config -> TransferConfig -> IgnoreDataPastArnold;
  1438.             break;
  1439.  
  1440.         case ATTR_PREFS_TRANSFER_TERMINATOR_CHAR:
  1441.  
  1442.             Number = Config -> TransferConfig -> TerminatorChar;
  1443.             break;
  1444.  
  1445.         case ATTR_PREFS_TRANSFER_LINEDELAY:
  1446.  
  1447.             Number = Config -> TransferConfig -> LineDelay;
  1448.             break;
  1449.  
  1450.         case ATTR_PREFS_TRANSFER_CHARDELAY:
  1451.  
  1452.             Number = Config -> TransferConfig -> CharDelay;
  1453.             break;
  1454.  
  1455.         case ATTR_PREFS_TRANSFER_LINEPROMPT:
  1456.  
  1457.             String = Config -> TransferConfig -> LinePrompt;
  1458.             break;
  1459.  
  1460.         case ATTR_PREFS_TRANSFER_TEXTPACING:
  1461.  
  1462.             Number = Config -> TransferConfig -> PacingMode;
  1463.             break;
  1464.  
  1465.         case ATTR_PREFS_TRANSFER_SENDTIMEOUT:
  1466.  
  1467.             Number = Config -> TransferConfig -> SendTimeout;
  1468.             break;
  1469.  
  1470.         case ATTR_PREFS_TRANSFER_ERROR_NOTIFY_COUNT:
  1471.  
  1472.             Number = Config -> TransferConfig -> ErrorNotification;
  1473.             break;
  1474.  
  1475.         case ATTR_PREFS_TRANSFER_ERROR_NOTIFY_WHEN:
  1476.  
  1477.             Number = Config -> TransferConfig -> TransferNotification;
  1478.             break;
  1479.  
  1480.         case ATTR_PREFS_TRANSFER_DEFAULT_TYPE:
  1481.  
  1482.             Number = Config -> TransferConfig -> DefaultType;
  1483.             break;
  1484.  
  1485.         case ATTR_PREFS_TRANSFER_ASCII_UPLOAD_TYPE:
  1486.  
  1487.             Number = Config -> TransferConfig -> ASCIIUploadType;
  1488.             break;
  1489.  
  1490.         case ATTR_PREFS_TRANSFER_ASCII_DOWNLOAD_TYPE:
  1491.  
  1492.             Number = Config -> TransferConfig -> ASCIIDownloadType;
  1493.             break;
  1494.  
  1495.         case ATTR_PREFS_TRANSFER_TEXT_UPLOAD_TYPE:
  1496.  
  1497.             Number = Config -> TransferConfig -> TextUploadType;
  1498.             break;
  1499.  
  1500.         case ATTR_PREFS_TRANSFER_TEXT_DOWNLOAD_TYPE:
  1501.  
  1502.             Number = Config -> TransferConfig -> TextDownloadType;
  1503.             break;
  1504.  
  1505.         case ATTR_PREFS_TRANSFER_BINARY_UPLOAD_TYPE:
  1506.  
  1507.             Number = Config -> TransferConfig -> BinaryUploadType;
  1508.             break;
  1509.  
  1510.         case ATTR_PREFS_TRANSFER_BINARY_DOWNLOAD_TYPE:
  1511.  
  1512.             Number = Config -> TransferConfig -> BinaryDownloadType;
  1513.             break;
  1514.  
  1515.         case ATTR_PREFS_TRANSFER_DEFAULT_SEND_SIGNATURE:
  1516.  
  1517.             TranslateBack(Config -> TransferConfig -> Signatures[TRANSFERSIG_DEFAULTUPLOAD] . Signature,Config -> TransferConfig -> Signatures[TRANSFERSIG_DEFAULTUPLOAD] . Length,ResultBuffer);
  1518.  
  1519.             String = ResultBuffer;
  1520.             break;
  1521.  
  1522.         case ATTR_PREFS_TRANSFER_DEFAULT_RECEIVE_SIGNATURE:
  1523.  
  1524.             TranslateBack(Config -> TransferConfig -> Signatures[TRANSFERSIG_DEFAULTDOWNLOAD] . Signature,Config -> TransferConfig -> Signatures[TRANSFERSIG_DEFAULTDOWNLOAD] . Length,ResultBuffer);
  1525.  
  1526.             String = ResultBuffer;
  1527.             break;
  1528.  
  1529.         case ATTR_PREFS_TRANSFER_ASCII_UPLOAD_SIGNATURE:
  1530.  
  1531.             TranslateBack(Config -> TransferConfig -> Signatures[TRANSFERSIG_ASCIIUPLOAD] . Signature,Config -> TransferConfig -> Signatures[TRANSFERSIG_ASCIIUPLOAD] . Length,ResultBuffer);
  1532.  
  1533.             String = ResultBuffer;
  1534.             break;
  1535.  
  1536.         case ATTR_PREFS_TRANSFER_ASCII_DOWNLOAD_SIGNATURE:
  1537.  
  1538.             TranslateBack(Config -> TransferConfig -> Signatures[TRANSFERSIG_ASCIIDOWNLOAD] . Signature,Config -> TransferConfig -> Signatures[TRANSFERSIG_ASCIIDOWNLOAD] . Length,ResultBuffer);
  1539.  
  1540.             String = ResultBuffer;
  1541.             break;
  1542.  
  1543.         case ATTR_PREFS_TRANSFER_TEXT_UPLOAD_SIGNATURE:
  1544.  
  1545.             TranslateBack(Config -> TransferConfig -> Signatures[TRANSFERSIG_TEXTUPLOAD] . Signature,Config -> TransferConfig -> Signatures[TRANSFERSIG_TEXTUPLOAD] . Length,ResultBuffer);
  1546.  
  1547.             String = ResultBuffer;
  1548.             break;
  1549.  
  1550.         case ATTR_PREFS_TRANSFER_TEXT_DOWNLOAD_SIGNATURE:
  1551.  
  1552.             TranslateBack(Config -> TransferConfig -> Signatures[TRANSFERSIG_TEXTDOWNLOAD] . Signature,Config -> TransferConfig -> Signatures[TRANSFERSIG_TEXTDOWNLOAD] . Length,ResultBuffer);
  1553.  
  1554.             String = ResultBuffer;
  1555.             break;
  1556.  
  1557.         case ATTR_PREFS_TRANSFER_BINARY_UPLOAD_SIGNATURE:
  1558.  
  1559.             TranslateBack(Config -> TransferConfig -> Signatures[TRANSFERSIG_BINARYUPLOAD] . Signature,Config -> TransferConfig -> Signatures[TRANSFERSIG_BINARYUPLOAD] . Length,ResultBuffer);
  1560.  
  1561.             String = ResultBuffer;
  1562.             break;
  1563.  
  1564.         case ATTR_PREFS_TRANSFER_BINARY_DOWNLOAD_SIGNATURE:
  1565.  
  1566.             TranslateBack(Config -> TransferConfig -> Signatures[TRANSFERSIG_BINARYDOWNLOAD] . Signature,Config -> TransferConfig -> Signatures[TRANSFERSIG_BINARYDOWNLOAD] . Length,ResultBuffer);
  1567.  
  1568.             String = ResultBuffer;
  1569.             break;
  1570.  
  1571.         case ATTR_PREFS_SPEECH_RATE:
  1572.  
  1573.             Number = SpeechConfig . Rate;
  1574.             break;
  1575.  
  1576.         case ATTR_PREFS_SPEECH_PITCH:
  1577.  
  1578.             Number = SpeechConfig . Pitch;
  1579.             break;
  1580.  
  1581.         case ATTR_PREFS_SPEECH_FREQUENCY:
  1582.  
  1583.             Number = SpeechConfig . Frequency;
  1584.             break;
  1585.  
  1586.         case ATTR_PREFS_SPEECH_SEXMODE:
  1587.  
  1588.             Number = SpeechConfig . Sex;
  1589.             break;
  1590.  
  1591.         case ATTR_PREFS_SPEECH_VOLUME:
  1592.  
  1593.             Number = (100 * SpeechConfig . Volume) / 64;
  1594.             break;
  1595.  
  1596.         case ATTR_PREFS_SPEECH_SPEECH:
  1597.  
  1598.             Number = SpeechConfig . Enabled;
  1599.             break;
  1600.  
  1601.         case ATTR_PREFS_TRANSLATIONS_X_SEND:
  1602.  
  1603.             if(Count1 < 0 || Count1 > 255)
  1604.                 Error = TERMERROR_INDEX_OUT_OF_RANGE;
  1605.             else
  1606.             {
  1607.                 STRPTR Str;
  1608.                 LONG Len;
  1609.                 UBYTE c;
  1610.  
  1611.                 c = Count1;
  1612.                 Len = 1;
  1613.                 Str = &c;
  1614.  
  1615.                 if(SendTable && SendTable[Count1])
  1616.                 {
  1617.                     Str = SendTable[Count1] -> String;
  1618.                     Len = SendTable[Count1] -> Len;
  1619.                 }
  1620.  
  1621.                 TranslateBack(Str,Len,ResultBuffer);
  1622.  
  1623.                 String = ResultBuffer;
  1624.             }
  1625.  
  1626.             break;
  1627.  
  1628.         case ATTR_PREFS_TRANSLATIONS_X_RECEIVE:
  1629.  
  1630.             if(Count1 < 0 || Count1 > 255)
  1631.                 Error = TERMERROR_INDEX_OUT_OF_RANGE;
  1632.             else
  1633.             {
  1634.                 STRPTR Str;
  1635.                 LONG Len;
  1636.                 UBYTE c;
  1637.  
  1638.                 c = Count1;
  1639.                 Len = 1;
  1640.                 Str = &c;
  1641.  
  1642.                 if(ReceiveTable)
  1643.                 {
  1644.                     if(ReceiveTable[Count1])
  1645.                     {
  1646.                         Str = ReceiveTable[Count1] -> String;
  1647.                         Len = ReceiveTable[Count1] -> Len;
  1648.                     }
  1649.                 }
  1650.  
  1651.                 TranslateBack(Str,Len,ResultBuffer);
  1652.             }
  1653.  
  1654.             String = ResultBuffer;
  1655.  
  1656.             break;
  1657.  
  1658.         case ATTR_PREFS_FASTMACROS_COUNT:
  1659.  
  1660.             Number = FastMacroCount;
  1661.             break;
  1662.  
  1663.         case ATTR_PREFS_FASTMACROS_X_NAME:
  1664.  
  1665.             if(Count1 < FastMacroCount && Count1 >= 0)
  1666.             {
  1667.                 struct MacroNode *Node = (struct MacroNode *)GetListNode(Count1,&FastMacroList);
  1668.  
  1669.                 String = Node -> mn_Macro;
  1670.             }
  1671.             else
  1672.                 Error = TERMERROR_INDEX_OUT_OF_RANGE;
  1673.  
  1674.             break;
  1675.  
  1676.         case ATTR_PREFS_FASTMACROS_X_CODE:
  1677.  
  1678.             if(Count1 < FastMacroCount && Count1 >= 0)
  1679.             {
  1680.                 struct MacroNode *Node = (struct MacroNode *)GetListNode(Count1,&FastMacroList);
  1681.  
  1682.                 String = Node -> mn_Code;
  1683.             }
  1684.             else
  1685.                 Error = TERMERROR_INDEX_OUT_OF_RANGE;
  1686.  
  1687.             break;
  1688.  
  1689.         case ATTR_PREFS_HOTKEYS_TERMSCREENTOFRONTTEXT:
  1690.  
  1691.             String = Hotkeys . termScreenToFront;
  1692.             break;
  1693.  
  1694.         case ATTR_PREFS_HOTKEYS_BUFFERSCREENTOFRONTTEXT:
  1695.  
  1696.             String = Hotkeys . BufferScreenToFront;
  1697.             break;
  1698.  
  1699.         case ATTR_PREFS_HOTKEYS_SKIPDIALENTRYTEXT:
  1700.  
  1701.             String = Hotkeys . SkipDialEntry;
  1702.             break;
  1703.  
  1704.         case ATTR_PREFS_HOTKEYS_ABORTAREXX:
  1705.  
  1706.             String = Hotkeys . AbortARexx;
  1707.             break;
  1708.  
  1709.         case ATTR_PREFS_HOTKEYS_COMMODITYPRIORITY:
  1710.  
  1711.             Number = Hotkeys . CommodityPriority;
  1712.             break;
  1713.  
  1714.         case ATTR_PREFS_HOTKEYS_HOTKEYSENABLED:
  1715.  
  1716.             Number = Hotkeys . HotkeysEnabled;
  1717.             break;
  1718.  
  1719.         case ATTR_PREFS_CURSORKEYS_UPTEXT:
  1720.  
  1721.             String = CursorKeys -> Keys[0][0];
  1722.             break;
  1723.  
  1724.         case ATTR_PREFS_CURSORKEYS_RIGHTTEXT:
  1725.  
  1726.             String = CursorKeys -> Keys[0][1];
  1727.             break;
  1728.  
  1729.         case ATTR_PREFS_CURSORKEYS_DOWNTEXT:
  1730.  
  1731.             String = CursorKeys -> Keys[0][2];
  1732.             break;
  1733.  
  1734.         case ATTR_PREFS_CURSORKEYS_LEFTTEXT:
  1735.  
  1736.             String = CursorKeys -> Keys[0][3];
  1737.             break;
  1738.  
  1739.         case ATTR_PREFS_CURSORKEYS_SHIFT_UPTEXT:
  1740.  
  1741.             String = CursorKeys -> Keys[1][0];
  1742.             break;
  1743.  
  1744.         case ATTR_PREFS_CURSORKEYS_SHIFT_RIGHTTEXT:
  1745.  
  1746.             String = CursorKeys -> Keys[1][1];
  1747.             break;
  1748.  
  1749.         case ATTR_PREFS_CURSORKEYS_SHIFT_DOWNTEXT:
  1750.  
  1751.             String = CursorKeys -> Keys[1][2];
  1752.             break;
  1753.  
  1754.         case ATTR_PREFS_CURSORKEYS_SHIFT_LEFTTEXT:
  1755.  
  1756.             String = CursorKeys -> Keys[1][3];
  1757.             break;
  1758.  
  1759.         case ATTR_PREFS_CURSORKEYS_ALT_UPTEXT:
  1760.  
  1761.             String = CursorKeys -> Keys[2][0];
  1762.             break;
  1763.  
  1764.         case ATTR_PREFS_CURSORKEYS_ALT_RIGHTTEXT:
  1765.  
  1766.             String = CursorKeys -> Keys[2][1];
  1767.             break;
  1768.  
  1769.         case ATTR_PREFS_CURSORKEYS_ALT_DOWNTEXT:
  1770.  
  1771.             String = CursorKeys -> Keys[2][2];
  1772.             break;
  1773.  
  1774.         case ATTR_PREFS_CURSORKEYS_ALT_LEFTTEXT:
  1775.  
  1776.             String = CursorKeys -> Keys[2][3];
  1777.             break;
  1778.  
  1779.         case ATTR_PREFS_CURSORKEYS_CONTROL_UPTEXT:
  1780.  
  1781.             String = CursorKeys -> Keys[3][0];
  1782.             break;
  1783.  
  1784.         case ATTR_PREFS_CURSORKEYS_CONTROL_RIGHTTEXT:
  1785.  
  1786.             String = CursorKeys -> Keys[3][1];
  1787.             break;
  1788.  
  1789.         case ATTR_PREFS_CURSORKEYS_CONTROL_DOWNTEXT:
  1790.  
  1791.             String = CursorKeys -> Keys[3][2];
  1792.             break;
  1793.  
  1794.         case ATTR_PREFS_CURSORKEYS_CONTROL_LEFTTEXT:
  1795.  
  1796.             String = CursorKeys -> Keys[3][3];
  1797.             break;
  1798.  
  1799.         case ATTR_PREFS_FUNCTIONKEYS_X:
  1800.  
  1801.             if(Count1 < 1 || Count1 > 10)
  1802.                 Error = TERMERROR_INDEX_OUT_OF_RANGE;
  1803.             else
  1804.                 String = MacroKeys -> Keys[0][Count1 - 1];
  1805.  
  1806.             break;
  1807.  
  1808.         case ATTR_PREFS_FUNCTIONKEYS_SHIFT_X:
  1809.  
  1810.             if(Count1 < 1 || Count1 > 10)
  1811.                 Error = TERMERROR_INDEX_OUT_OF_RANGE;
  1812.             else
  1813.                 String = MacroKeys -> Keys[1][Count1 - 1];
  1814.  
  1815.             break;
  1816.  
  1817.         case ATTR_PREFS_FUNCTIONKEYS_ALT_X:
  1818.  
  1819.             if(Count1 < 1 || Count1 > 10)
  1820.                 Error = TERMERROR_INDEX_OUT_OF_RANGE;
  1821.             else
  1822.                 String = MacroKeys -> Keys[2][Count1 - 1];
  1823.  
  1824.             break;
  1825.  
  1826.         case ATTR_PREFS_FUNCTIONKEYS_CONTROL_X:
  1827.  
  1828.             if(Count1 < 1 || Count1 > 10)
  1829.                 Error = TERMERROR_INDEX_OUT_OF_RANGE;
  1830.             else
  1831.                 String = MacroKeys -> Keys[3][Count1 - 1];
  1832.  
  1833.             break;
  1834.  
  1835.         case ATTR_PREFS_PROTOCOL:
  1836.  
  1837.             String = ProtocolOptsBuffer;
  1838.             break;
  1839.  
  1840.         case ATTR_PREFS_CONSOLE:
  1841.  
  1842.             String = WindowName;
  1843.             break;
  1844.  
  1845.         case ATTR_PHONEBOOK_COUNT:
  1846.  
  1847.             Number = NumPhoneEntries;
  1848.             break;
  1849.  
  1850.         case ATTR_PHONEBOOK_X_NAME:
  1851.  
  1852.             if(Count1 < NumPhoneEntries && Count1 >= 0)
  1853.                 String = Phonebook[Count1] -> Header -> Name;
  1854.             else
  1855.                 Error = TERMERROR_INDEX_OUT_OF_RANGE;
  1856.  
  1857.             break;
  1858.  
  1859.         case ATTR_PHONEBOOK_X_NUMBER:
  1860.  
  1861.             if(Count1 < NumPhoneEntries && Count1 >= 0)
  1862.                 String = Phonebook[Count1] -> Header -> Number;
  1863.             else
  1864.                 Error = TERMERROR_INDEX_OUT_OF_RANGE;
  1865.  
  1866.             break;
  1867.  
  1868.         case ATTR_PHONEBOOK_X_COMMENTTEXT:
  1869.  
  1870.             if(Count1 < NumPhoneEntries && Count1 >= 0)
  1871.                 String = Phonebook[Count1] -> Header -> Comment;
  1872.             else
  1873.                 Error = TERMERROR_INDEX_OUT_OF_RANGE;
  1874.  
  1875.             break;
  1876.  
  1877.         case ATTR_PHONEBOOK_X_USERNAME:
  1878.  
  1879.             if(Count1 < NumPhoneEntries && Count1 >= 0)
  1880.                 String = Phonebook[Count1] -> Header -> UserName;
  1881.             else
  1882.                 Error = TERMERROR_INDEX_OUT_OF_RANGE;
  1883.  
  1884.             break;
  1885.  
  1886.         case ATTR_PHONEBOOK_X_PASSWORDTEXT:
  1887.  
  1888.             if(Count1 < NumPhoneEntries && Count1 >= 0)
  1889.                 String = Phonebook[Count1] -> Header -> Password;
  1890.             else
  1891.                 Error = TERMERROR_INDEX_OUT_OF_RANGE;
  1892.  
  1893.             break;
  1894.  
  1895.         case ATTR_PREFS_SOUND_BELLNAME:
  1896.  
  1897.             String = SoundConfig . BellFile;
  1898.             break;
  1899.  
  1900.         case ATTR_PREFS_SOUND_ERROR:
  1901.  
  1902.             String = SoundConfig . ErrorNotifyFile;
  1903.             break;
  1904.  
  1905.         case ATTR_PREFS_SOUND_CONNECTNAME:
  1906.  
  1907.             String = SoundConfig . ConnectFile;
  1908.             break;
  1909.  
  1910.         case ATTR_PREFS_SOUND_DISCONNECTNAME:
  1911.  
  1912.             String = SoundConfig . DisconnectFile;
  1913.             break;
  1914.  
  1915.         case ATTR_PREFS_SOUND_GOODTRANSFERNAME:
  1916.  
  1917.             String = SoundConfig . GoodTransferFile;
  1918.             break;
  1919.  
  1920.         case ATTR_PREFS_SOUND_BADTRANSFERNAME:
  1921.  
  1922.             String = SoundConfig . BadTransferFile;
  1923.             break;
  1924.  
  1925.         case ATTR_PREFS_SOUND_RINGNAME:
  1926.  
  1927.             String = SoundConfig . RingFile;
  1928.             break;
  1929.  
  1930.         case ATTR_PREFS_SOUND_VOICENAME:
  1931.  
  1932.             String = SoundConfig . VoiceFile;
  1933.             break;
  1934.  
  1935.         case ATTR_PREFS_SOUND_PRELOAD:
  1936.  
  1937.             Number = SoundConfig . Preload;
  1938.             break;
  1939.  
  1940.         case ATTR_PREFS_SOUND_VOLUME:
  1941.  
  1942.             Number = SoundConfig . Volume;
  1943.             break;
  1944.     }
  1945.  
  1946.     if(!Error)
  1947.     {
  1948.         switch(AttributeTable[Index] . Type)
  1949.         {
  1950.             case INFO_TEXT:
  1951.  
  1952.                 *Result = String;
  1953.  
  1954.                 break;
  1955.  
  1956.             case INFO_NUMERIC:
  1957.  
  1958.                 SPrintf(ResultBuffer,"%ld",Number);
  1959.  
  1960.                 *Result = ResultBuffer;
  1961.  
  1962.                 break;
  1963.  
  1964.             case INFO_BOOLEAN:
  1965.  
  1966.                 *Result = ToBoolean(Number);
  1967.  
  1968.                 break;
  1969.  
  1970.             case INFO_MAPPED:
  1971.  
  1972.                 *Result = ToMap(Number,AttributeTable[Index] . Mappings);
  1973.  
  1974.                 break;
  1975.         }
  1976.     }
  1977.  
  1978.     return(Error);
  1979. }
  1980.  
  1981.     /* SetSingleAttribute(LONG ID,LONG Index,LONG Count1,STRPTR Input):
  1982.      *
  1983.      *    Beware the MONSTER!
  1984.      */
  1985.  
  1986. STATIC LONG
  1987. SetSingleAttribute(LONG ID,LONG Index,LONG Count1,STRPTR Input)
  1988. {
  1989.     STRPTR    String;
  1990.     LONG    Number,Error = 0,i;
  1991.  
  1992.     switch(AttributeTable[Index] . Type)
  1993.     {
  1994.         case INFO_TEXT:
  1995.  
  1996.             String = Input;
  1997.             break;
  1998.  
  1999.         case INFO_NUMERIC:
  2000.  
  2001.             Number = Atol(Input);
  2002.             break;
  2003.  
  2004.         case INFO_BOOLEAN:
  2005.  
  2006.             Number = FromBoolean(Input);
  2007.             break;
  2008.  
  2009.         case INFO_MAPPED:
  2010.  
  2011.             if((Number = FromMap(Input,AttributeTable[Index] . Mappings)) == -1)
  2012.                 return(ERROR_TOO_MANY_ARGS);
  2013.             else
  2014.                 break;
  2015.     }
  2016.  
  2017.     UpdateRequired        = TRUE;
  2018.     TransferUpdateRequired    = FALSE;
  2019.  
  2020.     switch(ID)
  2021.     {
  2022.         case ATTR_PREFS_SERIAL_BAUDRATE:
  2023.         {
  2024.             ULONG    Rate = 0;
  2025.             LONG    i;
  2026.  
  2027.             for(i = 0 ; i < NumBaudRates ; i++)
  2028.             {
  2029.                 if(BaudRates[i] >= Number)
  2030.                 {
  2031.                     Rate = BaudRates[i];
  2032.  
  2033.                     break;
  2034.                 }
  2035.             }
  2036.  
  2037.             if(Rate && Rate != Config -> SerialConfig -> BaudRate)
  2038.             {
  2039.                 Config -> SerialConfig -> BaudRate = Rate;
  2040.  
  2041.                 ConfigChanged = TRUE;
  2042.  
  2043.                 UpdateRequired = TRUE;
  2044.             }
  2045.  
  2046.             break;
  2047.         }
  2048.  
  2049.         case ATTR_PREFS_SERIAL_OWNDEVUNIT_REQUEST:
  2050.  
  2051.             Config -> SerialConfig -> SatisfyODURequests = Number;
  2052.  
  2053.             ConfigChanged = TRUE;
  2054.  
  2055.             break;
  2056.  
  2057.         case ATTR_PREFS_SERIAL_DIRECT_CONNECTION:
  2058.  
  2059.             Config -> SerialConfig -> DirectConnection = Number;
  2060.  
  2061.             ConfigChanged = TRUE;
  2062.  
  2063.             break;
  2064.  
  2065.         case ATTR_PREFS_SERIAL_BREAKLENGTH:
  2066.  
  2067.             Config -> SerialConfig -> BreakLength = Number;
  2068.  
  2069.             UpdateRequired = ConfigChanged = TRUE;
  2070.  
  2071.             break;
  2072.  
  2073.         case ATTR_PREFS_SERIAL_BUFFERSIZE:
  2074.         {
  2075.             LONG i;
  2076.  
  2077.             for(i = 9 ; i <= 19 ; i++)
  2078.             {
  2079.                 if(1L << i >= Number)
  2080.                 {
  2081.                     Config -> SerialConfig -> SerialBufferSize = 1L << i;
  2082.  
  2083.                     Update_CR_LF_Translation();
  2084.  
  2085.                     UpdateRequired = ConfigChanged = TRUE;
  2086.  
  2087.                     break;
  2088.                 }
  2089.             }
  2090.  
  2091.             break;
  2092.         }
  2093.  
  2094.         case ATTR_PREFS_SERIAL_QUANTUM:
  2095.         {
  2096.             LONG i;
  2097.  
  2098.             for(i = 8 ; i <= 19 ; i++)
  2099.             {
  2100.                 if(1L << i >= Number)
  2101.                 {
  2102.                     Config -> SerialConfig -> Quantum = 1L << i;
  2103.  
  2104.                     UpdateRequired = ConfigChanged = TRUE;
  2105.  
  2106.                     break;
  2107.                 }
  2108.             }
  2109.  
  2110.             break;
  2111.         }
  2112.  
  2113.         case ATTR_PREFS_SERIAL_DEVICENAME:
  2114.  
  2115.             strcpy(Config -> SerialConfig -> SerialDevice,String);
  2116.  
  2117.             UpdateRequired = ConfigChanged = TRUE;
  2118.  
  2119.             break;
  2120.  
  2121.         case ATTR_PREFS_SERIAL_UNIT:
  2122.  
  2123.             if(Number >= 0)
  2124.             {
  2125.                 Config -> SerialConfig -> UnitNumber = Number;
  2126.  
  2127.                 UpdateRequired = ConfigChanged = TRUE;
  2128.             }
  2129.             else
  2130.                 Error = TERMERROR_UNIT_NOT_AVAILABLE;
  2131.  
  2132.             break;
  2133.  
  2134.         case ATTR_PREFS_SERIAL_BITSPERCHAR:
  2135.  
  2136.             if(Number < 7 || Number > 8)
  2137.             {
  2138.                 Error = ERROR_BAD_NUMBER;
  2139.  
  2140.                 UpdateRequired = ConfigChanged = TRUE;
  2141.             }
  2142.             else
  2143.                 Config -> SerialConfig -> BitsPerChar = Number;
  2144.  
  2145.             break;
  2146.  
  2147.         case ATTR_PREFS_SERIAL_PARITYMODE:
  2148.  
  2149.             Config -> SerialConfig -> Parity = Number;
  2150.  
  2151.             UpdateRequired = ConfigChanged = TRUE;
  2152.  
  2153.             break;
  2154.  
  2155.         case ATTR_PREFS_SERIAL_STOPBITS:
  2156.  
  2157.             if(Number < 0 || Number > 1)
  2158.                 Error = ERROR_BAD_NUMBER;
  2159.             else
  2160.             {
  2161.                 Config -> SerialConfig -> StopBits = Number;
  2162.  
  2163.                 UpdateRequired = ConfigChanged = TRUE;
  2164.             }
  2165.  
  2166.             break;
  2167.  
  2168.         case ATTR_PREFS_SERIAL_HANDSHAKINGMODE:
  2169.  
  2170.             Config -> SerialConfig -> HandshakingProtocol = Number;
  2171.  
  2172.             UpdateRequired = ConfigChanged = TRUE;
  2173.  
  2174.             break;
  2175.  
  2176.         case ATTR_PREFS_SERIAL_DUPLEXMODE:
  2177.  
  2178.             Config -> SerialConfig -> Duplex = Number;
  2179.  
  2180.             ConfigChanged = TRUE;
  2181.  
  2182.             break;
  2183.  
  2184.         case ATTR_PREFS_SERIAL_XONXOFF:
  2185.  
  2186.             Config -> SerialConfig -> xONxOFF = Number;
  2187.  
  2188.             ConfigChanged = TRUE;
  2189.  
  2190.             break;
  2191.  
  2192.         case ATTR_PREFS_SERIAL_HIGHSPEED:
  2193.  
  2194.             Config -> SerialConfig -> HighSpeed = Number;
  2195.  
  2196.             UpdateRequired = ConfigChanged = TRUE;
  2197.  
  2198.             break;
  2199.  
  2200.         case ATTR_PREFS_SERIAL_SHARED:
  2201.  
  2202.             Config -> SerialConfig -> Shared = Number;
  2203.  
  2204.             UpdateRequired = ConfigChanged = TRUE;
  2205.  
  2206.             break;
  2207.  
  2208.         case ATTR_PREFS_SERIAL_STRIPBIT8:
  2209.  
  2210.             Config -> SerialConfig -> StripBit8 = Number;
  2211.  
  2212.             ConfigChanged = TRUE;
  2213.  
  2214.             break;
  2215.  
  2216.         case ATTR_PREFS_SERIAL_CARRIERCHECK:
  2217.  
  2218.             Config -> SerialConfig -> CheckCarrier = Number;
  2219.  
  2220.             ConfigChanged = TRUE;
  2221.  
  2222.             break;
  2223.  
  2224.         case ATTR_PREFS_SERIAL_PASSXONXOFFTHROUGH:
  2225.  
  2226.             Config -> SerialConfig -> PassThrough = Number;
  2227.  
  2228.             ConfigChanged = TRUE;
  2229.  
  2230.             break;
  2231.  
  2232.         case ATTR_PREFS_SERIAL_USE_OWNDEVUNIT:
  2233.  
  2234.             Config -> SerialConfig -> UseOwnDevUnit = Number;
  2235.  
  2236.             UpdateRequired = ConfigChanged = TRUE;
  2237.  
  2238.             break;
  2239.  
  2240.         case ATTR_PREFS_SERIAL_RELEASE_WHEN_ONLINE:
  2241.  
  2242.             Config -> SerialConfig -> ReleaseODUWhenOnline = Number;
  2243.  
  2244.             ConfigChanged = TRUE;
  2245.  
  2246.             break;
  2247.  
  2248.         case ATTR_PREFS_SERIAL_RELEASE_WHEN_DIALING:
  2249.  
  2250.             Config -> SerialConfig -> ReleaseODUWhenDialing = Number;
  2251.  
  2252.             ConfigChanged = TRUE;
  2253.  
  2254.             break;
  2255.  
  2256.         case ATTR_PREFS_SERIAL_NO_ODU_IF_SHARED:
  2257.  
  2258.             Config -> SerialConfig -> NoODUIfShared = Number;
  2259.  
  2260.             ConfigChanged = TRUE;
  2261.  
  2262.             break;
  2263.  
  2264.         case ATTR_PREFS_SERIAL_LOCAL_ECHO:
  2265.  
  2266.             Config -> SerialConfig -> Duplex = Number;
  2267.  
  2268.             ConfigChanged = TRUE;
  2269.  
  2270.             break;
  2271.  
  2272.         case ATTR_PREFS_MODEM_DIAL_MODE:
  2273.  
  2274.             Config -> ModemConfig -> DialMode = Number;
  2275.  
  2276.             ConfigChanged = TRUE;
  2277.  
  2278.             break;
  2279.  
  2280.         case ATTR_PREFS_MODEM_PBX_MODE:
  2281.  
  2282.             Config -> ModemConfig -> PBX_Mode = Number;
  2283.  
  2284.             ConfigChanged = TRUE;
  2285.  
  2286.             break;
  2287.  
  2288.         case ATTR_PREFS_MODEM_PBX_PREFIX:
  2289.  
  2290.             strcpy(Config -> ModemConfig -> PBX_Prefix,String);
  2291.  
  2292.             ConfigChanged = TRUE;
  2293.  
  2294.             break;
  2295.  
  2296.         case ATTR_PREFS_MODEM_DO_NOT_SEND_COMMANDS:
  2297.  
  2298.             Config -> ModemConfig -> DoNotSendMainModemCommands = Number;
  2299.  
  2300.             ConfigChanged = TRUE;
  2301.  
  2302.             break;
  2303.  
  2304.         case ATTR_PREFS_MODEM_CHAR_SEND_DELAY:
  2305.  
  2306.             Config -> ModemConfig -> CharSendDelay = Number;
  2307.  
  2308.             ConfigChanged = TRUE;
  2309.  
  2310.             break;
  2311.  
  2312.         case ATTR_PREFS_MODEM_MODEMINITTEXT:
  2313.  
  2314.             strcpy(Config -> ModemConfig -> ModemInit,String);
  2315.  
  2316.             ConfigChanged = TRUE;
  2317.  
  2318.             break;
  2319.  
  2320.         case ATTR_PREFS_MODEM_MODEMEXITTEXT:
  2321.  
  2322.             strcpy(Config -> ModemConfig -> ModemExit,String);
  2323.  
  2324.             ConfigChanged = TRUE;
  2325.  
  2326.             break;
  2327.  
  2328.         case ATTR_PREFS_MODEM_MODEMHANGUPTEXT:
  2329.  
  2330.             strcpy(Config -> ModemConfig -> ModemHangup,String);
  2331.  
  2332.             ConfigChanged = TRUE;
  2333.  
  2334.             break;
  2335.  
  2336.         case ATTR_PREFS_MODEM_DIALPREFIXTEXT:
  2337.  
  2338.             strcpy(Config -> ModemConfig -> DialPrefix,String);
  2339.  
  2340.             ConfigChanged = TRUE;
  2341.  
  2342.             break;
  2343.  
  2344.         case ATTR_PREFS_MODEM_DIALSUFFIXTEXT:
  2345.  
  2346.             strcpy(Config -> ModemConfig -> DialSuffix,String);
  2347.  
  2348.             ConfigChanged = TRUE;
  2349.  
  2350.             break;
  2351.  
  2352.         case ATTR_PREFS_MODEM_NOCARRIERTEXT:
  2353.  
  2354.             strcpy(Config -> ModemConfig -> NoCarrier,String);
  2355.  
  2356.             ConfigChanged = TRUE;
  2357.  
  2358.             break;
  2359.  
  2360.         case ATTR_PREFS_MODEM_NODIALTONETEXT:
  2361.  
  2362.             strcpy(Config -> ModemConfig -> NoDialTone,String);
  2363.  
  2364.             ConfigChanged = TRUE;
  2365.  
  2366.             break;
  2367.  
  2368.         case ATTR_PREFS_MODEM_CONNECTTEXT:
  2369.  
  2370.             strcpy(Config -> ModemConfig -> Connect,String);
  2371.  
  2372.             ConfigChanged = TRUE;
  2373.  
  2374.             break;
  2375.  
  2376.         case ATTR_PREFS_MODEM_VOICETEXT:
  2377.  
  2378.             strcpy(Config -> ModemConfig -> Voice,String);
  2379.  
  2380.             ConfigChanged = TRUE;
  2381.  
  2382.             break;
  2383.  
  2384.         case ATTR_PREFS_MODEM_RINGTEXT:
  2385.  
  2386.             strcpy(Config -> ModemConfig -> Ring,String);
  2387.  
  2388.             ConfigChanged = TRUE;
  2389.  
  2390.             break;
  2391.  
  2392.         case ATTR_PREFS_MODEM_BUSYTEXT:
  2393.  
  2394.             strcpy(Config -> ModemConfig -> Busy,String);
  2395.  
  2396.             ConfigChanged = TRUE;
  2397.  
  2398.             break;
  2399.  
  2400.         case ATTR_PREFS_MODEM_OKTEXT:
  2401.  
  2402.             strcpy(Config -> ModemConfig -> Ok,String);
  2403.  
  2404.             ConfigChanged = TRUE;
  2405.  
  2406.             break;
  2407.  
  2408.         case ATTR_PREFS_MODEM_ERRORTEXT:
  2409.  
  2410.             strcpy(Config -> ModemConfig -> Error,String);
  2411.  
  2412.             ConfigChanged = TRUE;
  2413.  
  2414.             break;
  2415.  
  2416.         case ATTR_PREFS_MODEM_REDIALDELAY:
  2417.  
  2418.             if(Number >= 0)
  2419.             {
  2420.                 Config -> ModemConfig -> RedialDelay = Number;
  2421.  
  2422.                 ConfigChanged = TRUE;
  2423.             }
  2424.             else
  2425.                 Error = ERROR_BAD_NUMBER;
  2426.  
  2427.             break;
  2428.  
  2429.         case ATTR_PREFS_MODEM_DIALRETRIES:
  2430.  
  2431.             if(Number < 0)
  2432.                 Error = ERROR_BAD_NUMBER;
  2433.             else
  2434.             {
  2435.                 Config -> ModemConfig -> DialRetries = Number;
  2436.  
  2437.                 ConfigChanged = TRUE;
  2438.             }
  2439.  
  2440.             break;
  2441.  
  2442.         case ATTR_PREFS_MODEM_DIALTIMEOUT:
  2443.  
  2444.             if(Number < 0)
  2445.                 Error = ERROR_BAD_NUMBER;
  2446.             else
  2447.             {
  2448.                 Config -> ModemConfig -> DialTimeout = Number;
  2449.  
  2450.                 ConfigChanged = TRUE;
  2451.             }
  2452.  
  2453.             break;
  2454.  
  2455.         case ATTR_PREFS_MODEM_INTER_DIAL_DELAY:
  2456.  
  2457.             if(Number < 0)
  2458.                 Error = ERROR_BAD_NUMBER;
  2459.             else
  2460.             {
  2461.                 Config -> ModemConfig -> InterDialDelay = Number;
  2462.  
  2463.                 ConfigChanged = TRUE;
  2464.             }
  2465.  
  2466.             break;
  2467.  
  2468.         case ATTR_PREFS_MODEM_CONNECTAUTOBAUD:
  2469.  
  2470.             Config -> ModemConfig -> ConnectAutoBaud = Number;
  2471.  
  2472.             ConfigChanged = TRUE;
  2473.  
  2474.             break;
  2475.  
  2476.         case ATTR_PREFS_MODEM_HANGUPDROPSDTR:
  2477.  
  2478.             Config -> ModemConfig -> DropDTR = Number;
  2479.  
  2480.             ConfigChanged = TRUE;
  2481.  
  2482.             break;
  2483.  
  2484.         case ATTR_PREFS_MODEM_REDIALAFTERHANGUP:
  2485.  
  2486.             Config -> ModemConfig -> RedialAfterHangup = Number;
  2487.  
  2488.             ConfigChanged = TRUE;
  2489.  
  2490.             break;
  2491.  
  2492.         case ATTR_PREFS_MODEM_VERBOSEDIALING:
  2493.  
  2494.             Config -> ModemConfig -> VerboseDialing = Number;
  2495.  
  2496.             ConfigChanged = TRUE;
  2497.  
  2498.             break;
  2499.  
  2500.         case ATTR_PREFS_MODEM_NOCARRIERISBUSY:
  2501.  
  2502.             Config -> ModemConfig -> NoCarrierIsBusy = Number;
  2503.  
  2504.             ConfigChanged = TRUE;
  2505.  
  2506.             break;
  2507.  
  2508.         case ATTR_PREFS_MODEM_CONNECTLIMIT:
  2509.  
  2510.             if(Number > 1440)
  2511.                 Number = 1440;
  2512.  
  2513.             Config -> ModemConfig -> ConnectLimit = Number;
  2514.  
  2515.             ConfigChanged = TRUE;
  2516.  
  2517.             break;
  2518.  
  2519.         case ATTR_PREFS_MODEM_CONNECTLIMITMACRO:
  2520.  
  2521.             strcpy(Config -> ModemConfig -> ConnectLimitMacro,String);
  2522.  
  2523.             ConfigChanged = TRUE;
  2524.  
  2525.             break;
  2526.  
  2527.         case ATTR_PREFS_MODEM_TIME_TO_CONNECT:
  2528.  
  2529.             if(Number >= 0)
  2530.             {
  2531.                 Config -> ModemConfig -> TimeToConnect = Number;
  2532.  
  2533.                 ConfigChanged = TRUE;
  2534.             }
  2535.             else
  2536.                 Error = ERROR_BAD_NUMBER;
  2537.  
  2538.             break;
  2539.  
  2540.         case ATTR_PREFS_COMMANDS_STARTUPMACROTEXT:
  2541.  
  2542.             strcpy(Config -> CommandConfig -> StartupMacro,String);
  2543.  
  2544.             ConfigChanged = TRUE;
  2545.  
  2546.             break;
  2547.  
  2548.         case ATTR_PREFS_COMMANDS_LOGOFFMACROTEXT:
  2549.  
  2550.             strcpy(Config -> CommandConfig -> LogoffMacro,String);
  2551.  
  2552.             ConfigChanged = TRUE;
  2553.  
  2554.             break;
  2555.  
  2556.         case ATTR_PREFS_COMMANDS_UPLOADMACROTEXT:
  2557.  
  2558.             strcpy(Config -> CommandConfig -> UploadMacro,String);
  2559.  
  2560.             ConfigChanged = TRUE;
  2561.  
  2562.             break;
  2563.  
  2564.         case ATTR_PREFS_COMMANDS_DOWNLOADMACROTEXT:
  2565.  
  2566.             strcpy(Config -> CommandConfig -> DownloadMacro,String);
  2567.  
  2568.             ConfigChanged = TRUE;
  2569.  
  2570.             break;
  2571.  
  2572.         case ATTR_PREFS_COMMANDS_LOGINMACROTEXT:
  2573.  
  2574.             strcpy(Config -> CommandConfig -> LoginMacro,String);
  2575.  
  2576.             ConfigChanged = TRUE;
  2577.  
  2578.             break;
  2579.  
  2580.         case ATTR_PREFS_SCREEN_COLOURMODE:
  2581.  
  2582.             Config -> ScreenConfig -> ColourMode = Number;
  2583.  
  2584.             UpdateRequired = ConfigChanged = TRUE;
  2585.  
  2586.             Default2CurrentPalette(Config);
  2587.  
  2588.             break;
  2589.  
  2590.         case ATTR_PREFS_SCREEN_FONTNAME:
  2591.  
  2592.             strcpy(Config -> ScreenConfig -> FontName,String);
  2593.  
  2594.             UpdateRequired = ConfigChanged = TRUE;
  2595.  
  2596.             break;
  2597.  
  2598.         case ATTR_PREFS_SCREEN_FONTSIZE:
  2599.  
  2600.             if(Number < 1)
  2601.                 Error = ERROR_BAD_NUMBER;
  2602.             else
  2603.             {
  2604.                 Config -> ScreenConfig -> FontHeight = Number;
  2605.  
  2606.                 UpdateRequired = ConfigChanged = TRUE;
  2607.             }
  2608.  
  2609.             break;
  2610.  
  2611.         case ATTR_PREFS_SCREEN_MAKESCREENPUBLIC:
  2612.  
  2613.             Config -> ScreenConfig -> MakeScreenPublic = Number;
  2614.  
  2615.             UpdateRequired = ConfigChanged = TRUE;
  2616.  
  2617.             break;
  2618.  
  2619.         case ATTR_PREFS_SCREEN_SHANGHAIWINDOWS:
  2620.  
  2621.             Config -> ScreenConfig -> ShanghaiWindows = Number;
  2622.  
  2623.             UpdateRequired = ConfigChanged = TRUE;
  2624.  
  2625.             break;
  2626.  
  2627.         case ATTR_PREFS_SCREEN_BLINKING:
  2628.  
  2629.             Config -> ScreenConfig -> Blinking = Number;
  2630.  
  2631.             UpdateRequired = ConfigChanged = TRUE;
  2632.  
  2633.             break;
  2634.  
  2635.         case ATTR_PREFS_SCREEN_FASTERLAYOUT:
  2636.  
  2637.             Config -> ScreenConfig -> FasterLayout = Number;
  2638.  
  2639.             UpdateRequired = ConfigChanged = TRUE;
  2640.  
  2641.             break;
  2642.  
  2643.         case ATTR_PREFS_SCREEN_TITLEBAR:
  2644.  
  2645.             Config -> ScreenConfig -> TitleBar = Number;
  2646.  
  2647.             UpdateRequired = ConfigChanged = TRUE;
  2648.  
  2649.             break;
  2650.  
  2651.         case ATTR_PREFS_SCREEN_STATUSLINEMODE:
  2652.  
  2653.             Config -> ScreenConfig -> StatusLine = Number;
  2654.  
  2655.             UpdateRequired = ConfigChanged = TRUE;
  2656.  
  2657.             break;
  2658.  
  2659.         case ATTR_PREFS_SCREEN_USEWORKBENCH:
  2660.  
  2661.             Config -> ScreenConfig -> UseWorkbench = Number;
  2662.  
  2663.             UpdateRequired = ConfigChanged = TRUE;
  2664.  
  2665.             break;
  2666.  
  2667.         case ATTR_PREFS_SCREEN_PUBSCREENNAME:
  2668.  
  2669.             strcpy(Config -> ScreenConfig -> PubScreenName,String);
  2670.  
  2671.             UpdateRequired = ConfigChanged = TRUE;
  2672.  
  2673.             break;
  2674.  
  2675.         case ATTR_PREFS_SCREEN_ONLINEDISPLAY:
  2676.  
  2677.             Config -> ScreenConfig -> TimeMode = Number;
  2678.  
  2679.             ConfigChanged = TRUE;
  2680.  
  2681.             break;
  2682.  
  2683.         case ATTR_PREFS_SCREEN_USEPENS:
  2684.  
  2685.             Config -> ScreenConfig -> UsePens = Number;
  2686.  
  2687.             UpdateRequired = ConfigChanged = TRUE;
  2688.  
  2689.             break;
  2690.  
  2691.         case ATTR_PREFS_SCREEN_WINDOW_BORDER:
  2692.  
  2693.             Config -> ScreenConfig -> ShareScreen = Number;
  2694.  
  2695.             UpdateRequired = ConfigChanged = TRUE;
  2696.  
  2697.             break;
  2698.  
  2699.         case ATTR_PREFS_SCREEN_SPLIT_STATUS:
  2700.  
  2701.             Config -> ScreenConfig -> SplitStatus = Number;
  2702.  
  2703.             UpdateRequired = ConfigChanged = TRUE;
  2704.  
  2705.             break;
  2706.  
  2707.         case ATTR_PREFS_TERMINAL_BELLMODE:
  2708.  
  2709.             Config -> TerminalConfig -> BellMode = Number;
  2710.  
  2711.             ConfigChanged = TRUE;
  2712.  
  2713.             break;
  2714.  
  2715.         case ATTR_PREFS_TERMINAL_EMULATIONMODE:
  2716.  
  2717.             Config -> TerminalConfig -> EmulationMode = Number;
  2718.  
  2719.             ConfigChanged = TRUE;
  2720.  
  2721.             break;
  2722.  
  2723.         case ATTR_PREFS_TERMINAL_FONTMODE:
  2724.  
  2725.             Config -> TerminalConfig -> FontMode = Number;
  2726.  
  2727.             ConfigChanged = TRUE;
  2728.  
  2729.             break;
  2730.  
  2731.         case ATTR_PREFS_TERMINAL_SENDCRMODE:
  2732.  
  2733.             Config -> TerminalConfig -> SendCR = Number;
  2734.  
  2735.             ConfigChanged = TRUE;
  2736.  
  2737.             break;
  2738.  
  2739.         case ATTR_PREFS_TERMINAL_SENDLFMODE:
  2740.  
  2741.             Config -> TerminalConfig -> SendLF = Number;
  2742.  
  2743.             ConfigChanged = TRUE;
  2744.  
  2745.             break;
  2746.  
  2747.         case ATTR_PREFS_TERMINAL_RECEIVECRMODE:
  2748.  
  2749.             Config -> TerminalConfig -> ReceiveCR = Number;
  2750.  
  2751.             Update_CR_LF_Translation();
  2752.  
  2753.             ConfigChanged = TRUE;
  2754.  
  2755.             break;
  2756.  
  2757.         case ATTR_PREFS_TERMINAL_RECEIVELFMODE:
  2758.  
  2759.             Config -> TerminalConfig -> ReceiveLF = Number;
  2760.  
  2761.             Update_CR_LF_Translation();
  2762.  
  2763.             ConfigChanged = TRUE;
  2764.  
  2765.             break;
  2766.  
  2767.         case ATTR_PREFS_TERMINAL_NUMCOLUMNS:
  2768.  
  2769.             if(Number < 0)
  2770.                 Number = 0;
  2771.  
  2772.             Config -> TerminalConfig -> NumColumns = Number;
  2773.  
  2774.             UpdateRequired = ConfigChanged = TRUE;
  2775.  
  2776.             break;
  2777.  
  2778.         case ATTR_PREFS_TERMINAL_NUMLINES:
  2779.  
  2780.             if(Number < 0)
  2781.                 Number = 0;
  2782.  
  2783.             Config -> TerminalConfig -> NumLines = Number;
  2784.  
  2785.             UpdateRequired = ConfigChanged = TRUE;
  2786.  
  2787.             break;
  2788.  
  2789.         case ATTR_PREFS_TERMINAL_KEYMAPNAME:
  2790.  
  2791.             strcpy(Config -> TerminalConfig -> KeyMapFileName,String);
  2792.  
  2793.             ConfigChanged = TRUE;
  2794.  
  2795.             break;
  2796.  
  2797.         case ATTR_PREFS_TERMINAL_EMULATIONNAME:
  2798.  
  2799.             strcpy(Config -> TerminalConfig -> EmulationFileName,String);
  2800.  
  2801.             UpdateRequired = ConfigChanged = TRUE;
  2802.  
  2803.             break;
  2804.  
  2805.         case ATTR_PREFS_TERMINAL_FONTNAME:
  2806.  
  2807.             strcpy(Config -> TerminalConfig -> TextFontName,String);
  2808.  
  2809.             UpdateRequired = ConfigChanged = TRUE;
  2810.  
  2811.             break;
  2812.  
  2813.         case ATTR_PREFS_TERMINAL_USETERMINALPROCESS:
  2814.  
  2815.             Config -> TerminalConfig -> UseTerminalTask = Number;
  2816.  
  2817.             UpdateRequired = ConfigChanged = TRUE;
  2818.  
  2819.             break;
  2820.  
  2821.         case ATTR_PREFS_TERMINAL_AUTOSIZE:
  2822.  
  2823.             Config -> TerminalConfig -> AutoSize = Number;
  2824.  
  2825.             UpdateRequired = ConfigChanged = TRUE;
  2826.  
  2827.             break;
  2828.  
  2829.         case ATTR_PREFS_TERMINAL_FONTSIZE:
  2830.  
  2831.             if(Number < 1)
  2832.                 Error = ERROR_BAD_NUMBER;
  2833.             else
  2834.             {
  2835.                 Config -> TerminalConfig -> TextFontHeight = Number;
  2836.  
  2837.                 UpdateRequired = ConfigChanged = TRUE;
  2838.             }
  2839.  
  2840.             break;
  2841.  
  2842.         case ATTR_PREFS_PATHS_ASCIIUPLOADPATH:
  2843.  
  2844.             strcpy(Config -> PathConfig -> ASCIIUploadPath,String);
  2845.  
  2846.             ConfigChanged = TRUE;
  2847.  
  2848.             break;
  2849.  
  2850.         case ATTR_PREFS_PATHS_ASCIIDOWNLOADPATH:
  2851.  
  2852.             strcpy(Config -> PathConfig -> ASCIIDownloadPath,String);
  2853.  
  2854.             ConfigChanged = TRUE;
  2855.  
  2856.             break;
  2857.  
  2858.         case ATTR_PREFS_PATHS_TEXTUPLOADPATH:
  2859.  
  2860.             strcpy(Config -> PathConfig -> TextUploadPath,String);
  2861.  
  2862.             ConfigChanged = TRUE;
  2863.  
  2864.             break;
  2865.  
  2866.         case ATTR_PREFS_PATHS_TEXTDOWNLOADPATH:
  2867.  
  2868.             strcpy(Config -> PathConfig -> TextDownloadPath,String);
  2869.  
  2870.             ConfigChanged = TRUE;
  2871.  
  2872.             break;
  2873.  
  2874.         case ATTR_PREFS_PATHS_BINARYUPLOADPATH:
  2875.  
  2876.             strcpy(Config -> PathConfig -> BinaryUploadPath,String);
  2877.  
  2878.             ConfigChanged = TRUE;
  2879.  
  2880.             break;
  2881.  
  2882.         case ATTR_PREFS_PATHS_BINARYDOWNLOADPATH:
  2883.  
  2884.             strcpy(Config -> PathConfig -> BinaryDownloadPath,String);
  2885.  
  2886.             ConfigChanged = TRUE;
  2887.  
  2888.             break;
  2889.  
  2890.         case ATTR_PREFS_PATHS_CONFIGPATH:
  2891.  
  2892.             strcpy(Config -> PathConfig -> DefaultStorage,String);
  2893.  
  2894.             ConfigChanged = TRUE;
  2895.  
  2896.             break;
  2897.  
  2898.         case ATTR_PREFS_PATHS_EDITORNAME:
  2899.  
  2900.             strcpy(Config -> PathConfig -> Editor,String);
  2901.  
  2902.             ConfigChanged = TRUE;
  2903.  
  2904.             break;
  2905.  
  2906.         case ATTR_PREFS_PATHS_HELPFILENAME:
  2907.  
  2908.             strcpy(Config -> PathConfig -> HelpFile,String);
  2909.  
  2910.             ConfigChanged = TRUE;
  2911.  
  2912.             break;
  2913.  
  2914.         case ATTR_PREFS_MISC_WAITSTRING:
  2915.  
  2916.             strcpy(Config -> MiscConfig -> WaitString,String);
  2917.  
  2918.             ConfigChanged = TRUE;
  2919.  
  2920.             break;
  2921.  
  2922.         case ATTR_PREFS_MISC_WAITDELAY:
  2923.  
  2924.             if(Number < 1)
  2925.                 Number = 1;
  2926.             else
  2927.             {
  2928.                 if(Number > 60 * 60)
  2929.                     Number = 60 * 60;
  2930.             }
  2931.  
  2932.             Config -> MiscConfig -> WaitDelay = Number;
  2933.  
  2934.             ConfigChanged = TRUE;
  2935.  
  2936.             break;
  2937.  
  2938.         case ATTR_PREFS_MISC_ALERTMODE:
  2939.  
  2940.             Config -> MiscConfig -> AlertMode = Number;
  2941.  
  2942.             ConfigChanged = TRUE;
  2943.  
  2944.             break;
  2945.  
  2946.         case ATTR_PREFS_MISC_REQUESTERMODE:
  2947.  
  2948.             Config -> MiscConfig -> RequesterMode = Number;
  2949.  
  2950.             ConfigChanged = TRUE;
  2951.  
  2952.             break;
  2953.  
  2954.         case ATTR_PREFS_MISC_REQUESTERWIDTH:
  2955.  
  2956.             if(Number < 80)
  2957.                 Number = 80;
  2958.  
  2959.             Config -> MiscConfig -> RequesterWidth = Number;
  2960.  
  2961.             ConfigChanged = TRUE;
  2962.  
  2963.             break;
  2964.  
  2965.         case ATTR_PREFS_MISC_REQUESTERHEIGHT:
  2966.  
  2967.             if(Number < 80)
  2968.                 Number = 80;
  2969.  
  2970.             Config -> MiscConfig -> RequesterHeight = Number;
  2971.  
  2972.             ConfigChanged = TRUE;
  2973.  
  2974.             break;
  2975.  
  2976.         case ATTR_PREFS_MISC_PRIORITY:
  2977.  
  2978.             if(Number < -128)
  2979.                 Number = -128;
  2980.  
  2981.             if(Number > 127)
  2982.                 Number = 127;
  2983.  
  2984.             Config -> MiscConfig -> Priority = Number;
  2985.  
  2986.             UpdateRequired = ConfigChanged = TRUE;
  2987.  
  2988.             break;
  2989.  
  2990.         case ATTR_PREFS_MISC_BACKUPCONFIG:
  2991.  
  2992.             Config -> MiscConfig -> BackupConfig = Number;
  2993.  
  2994.             ConfigChanged = TRUE;
  2995.  
  2996.             break;
  2997.  
  2998.         case ATTR_PREFS_MISC_OVERWRITE_WARNING:
  2999.  
  3000.             Config -> MiscConfig -> ProtectiveMode = Number;
  3001.  
  3002.             ConfigChanged = TRUE;
  3003.  
  3004.             break;
  3005.  
  3006.         case ATTR_PREFS_MISC_OPENFASTMACROPANEL:
  3007.  
  3008.             Config -> MiscConfig -> OpenFastMacroPanel = Number;
  3009.  
  3010.             ConfigChanged = TRUE;
  3011.  
  3012.             break;
  3013.  
  3014.         case ATTR_PREFS_MISC_RELEASEDEVICE:
  3015.  
  3016.             Config -> MiscConfig -> ReleaseDevice = Number;
  3017.  
  3018.             ConfigChanged = TRUE;
  3019.  
  3020.             break;
  3021.  
  3022.         case ATTR_PREFS_TRANSFER_OVERRIDEPATH:
  3023.         case ATTR_PREFS_MISC_OVERRIDEPATH:
  3024.  
  3025.             Config -> TransferConfig -> OverridePath = Number;
  3026.  
  3027.             ConfigChanged = TRUE;
  3028.  
  3029.             break;
  3030.  
  3031.         case ATTR_PREFS_MISC_AUTOUPLOAD:
  3032.  
  3033.             Config -> MiscConfig -> AutoUpload = Number;
  3034.  
  3035.             ConfigChanged = TRUE;
  3036.  
  3037.             break;
  3038.  
  3039.         case ATTR_PREFS_TRANSFER_SETARCHIVEDBIT:
  3040.         case ATTR_PREFS_MISC_SETARCHIVEDBIT:
  3041.  
  3042.             Config -> TransferConfig -> SetArchivedBit = Number;
  3043.  
  3044.             ConfigChanged = TRUE;
  3045.  
  3046.             break;
  3047.  
  3048.         case ATTR_PREFS_TRANSFER_COMMENTMODE:
  3049.         case ATTR_PREFS_MISC_COMMENTMODE:
  3050.  
  3051.             Config -> TransferConfig -> IdentifyFiles = Number;
  3052.  
  3053.             ConfigChanged = TRUE;
  3054.  
  3055.             break;
  3056.  
  3057.         case ATTR_PREFS_MISC_TRANSFERICONS:
  3058.         case ATTR_PREFS_TRANSFER_TRANSFERICONS:
  3059.  
  3060.             Config -> TransferConfig -> TransferIcons = Number;
  3061.  
  3062.             ConfigChanged = TRUE;
  3063.  
  3064.             break;
  3065.  
  3066.         case ATTR_PREFS_MISC_CREATEICONS:
  3067.  
  3068.             Config -> MiscConfig -> CreateIcons = Number;
  3069.  
  3070.             ConfigChanged = TRUE;
  3071.  
  3072.             break;
  3073.  
  3074.         case ATTR_PREFS_MISC_SIMPLEIO:
  3075.  
  3076.             Config -> MiscConfig -> SimpleIO = Number;
  3077.  
  3078.             ConfigChanged = TRUE;
  3079.  
  3080.             break;
  3081.  
  3082.         case ATTR_PREFS_MISC_HIDE_UPLOAD_ICON:
  3083.         case ATTR_PREFS_TRANSFER_HIDE_UPLOAD_ICON:
  3084.  
  3085.             Config -> TransferConfig -> HideUploadIcon = Number;
  3086.  
  3087.             ConfigChanged = TRUE;
  3088.  
  3089.             break;
  3090.  
  3091.         case ATTR_PREFS_MISC_TRANSFER_PERFMETER:
  3092.         case ATTR_PREFS_TRANSFER_TRANSFER_PERFMETER:
  3093.  
  3094.             Config -> TransferConfig -> PerfMeter = Number;
  3095.  
  3096.             ConfigChanged = TRUE;
  3097.  
  3098.             break;
  3099.  
  3100.         case ATTR_PREFS_MISC_IOBUFFERSIZE:
  3101.  
  3102.             if(Number < 1)
  3103.                 Number = 1;
  3104.             else
  3105.             {
  3106.                 if(Number > (1L << 20))
  3107.                     Number = (1L << 20);
  3108.             }
  3109.  
  3110.             for(i = 12 ; i <= 20 ; i++)
  3111.             {
  3112.                 if(Number >= (1L << i) && Number <= (1L << (i + 1)))
  3113.                 {
  3114.                     Number = (1L << i);
  3115.  
  3116.                     break;
  3117.                 }
  3118.             }
  3119.  
  3120.             Config -> MiscConfig -> IOBufferSize = Number;
  3121.  
  3122.             ConfigChanged = TRUE;
  3123.  
  3124.             break;
  3125.  
  3126.         case ATTR_PREFS_CLIPBOARD_UNIT:
  3127.  
  3128.             if(Number < 0)
  3129.                 Error = TERMERROR_UNIT_NOT_AVAILABLE;
  3130.             else
  3131.             {
  3132.                 Config -> ClipConfig -> ClipboardUnit = Number;
  3133.  
  3134.                 ConfigChanged = TRUE;
  3135.             }
  3136.  
  3137.             break;
  3138.  
  3139.         case ATTR_PREFS_CLIPBOARD_LINEDELAY:
  3140.  
  3141.             if(Number < 0)
  3142.                 Error = ERROR_BAD_NUMBER;
  3143.             else
  3144.             {
  3145.                 Config -> ClipConfig -> LineDelay = Number;
  3146.  
  3147.                 ConfigChanged = TRUE;
  3148.             }
  3149.  
  3150.             break;
  3151.  
  3152.         case ATTR_PREFS_CLIPBOARD_CHARDELAY:
  3153.  
  3154.             if(Number < 0)
  3155.                 Error = ERROR_BAD_NUMBER;
  3156.             else
  3157.             {
  3158.                 Config -> ClipConfig -> CharDelay = Number;
  3159.  
  3160.                 ConfigChanged = TRUE;
  3161.             }
  3162.  
  3163.             break;
  3164.  
  3165.         case ATTR_PREFS_CLIPBOARD_INSERTPREFIXTEXT:
  3166.  
  3167.             strcpy(Config -> ClipConfig -> InsertPrefix,String);
  3168.  
  3169.             ConfigChanged = TRUE;
  3170.  
  3171.             break;
  3172.  
  3173.         case ATTR_PREFS_CLIPBOARD_INSERTSUFFIXTEXT:
  3174.  
  3175.             strcpy(Config -> ClipConfig -> InsertSuffix,String);
  3176.  
  3177.             ConfigChanged = TRUE;
  3178.  
  3179.             break;
  3180.  
  3181.         case ATTR_PREFS_CLIPBOARD_LINEPROMPT:
  3182.  
  3183.             strcpy(Config -> ClipConfig -> LinePrompt,String);
  3184.  
  3185.             ConfigChanged = TRUE;
  3186.  
  3187.             break;
  3188.  
  3189.         case ATTR_PREFS_CLIPBOARD_TEXTPACING:
  3190.  
  3191.             Config -> ClipConfig -> PacingMode = Number;
  3192.  
  3193.             ConfigChanged = TRUE;
  3194.  
  3195.             break;
  3196.  
  3197.         case ATTR_PREFS_CLIPBOARD_SENDTIMEOUT:
  3198.  
  3199.             Config -> ClipConfig -> SendTimeout = Number;
  3200.  
  3201.             ConfigChanged = TRUE;
  3202.  
  3203.             break;
  3204.  
  3205.         case ATTR_PREFS_CLIPBOARD_CONVERTLF:
  3206.  
  3207.             Config -> ClipConfig -> ConvertLF = Number;
  3208.  
  3209.             ConfigChanged = TRUE;
  3210.  
  3211.             break;
  3212.  
  3213.         case ATTR_PREFS_CAPTURE_CONVERTCHARACTERS:
  3214.  
  3215.             Config -> CaptureConfig -> ConvertChars = Number;
  3216.  
  3217.             ConfigChanged = TRUE;
  3218.  
  3219.             break;
  3220.  
  3221.         case ATTR_PREFS_CAPTURE_BUFFERMODE:
  3222.  
  3223.             Config -> CaptureConfig -> BufferMode = Number;
  3224.  
  3225.             ConfigChanged = TRUE;
  3226.  
  3227.             break;
  3228.  
  3229.         case ATTR_PREFS_CAPTURE_LOGACTIONS:
  3230.  
  3231.             Config -> CaptureConfig -> LogActions = Number;
  3232.  
  3233.             ConfigChanged = TRUE;
  3234.  
  3235.             break;
  3236.  
  3237.         case ATTR_PREFS_CAPTURE_LOGCALLS:
  3238.  
  3239.             Config -> CaptureConfig -> LogCall = Number;
  3240.  
  3241.             ConfigChanged = TRUE;
  3242.  
  3243.             break;
  3244.  
  3245.         case ATTR_PREFS_CAPTURE_LOGFILENAME:
  3246.  
  3247.             strcpy(Config -> CaptureConfig -> LogFileName,String);
  3248.  
  3249.             ConfigChanged = TRUE;
  3250.  
  3251.             break;
  3252.  
  3253.         case ATTR_PREFS_CAPTURE_MAXBUFFERSIZE:
  3254.  
  3255.             if(Number < 0)
  3256.                 Number = 0;
  3257.  
  3258.             Config -> CaptureConfig -> MaxBufferSize = Number;
  3259.  
  3260.             ConfigChanged = TRUE;
  3261.  
  3262.             break;
  3263.  
  3264.         case ATTR_PREFS_CAPTURE_BUFFER:
  3265.  
  3266.             Config -> CaptureConfig -> BufferEnabled = Number;
  3267.  
  3268.             ConfigChanged = TRUE;
  3269.  
  3270.             break;
  3271.  
  3272.         case ATTR_PREFS_CAPTURE_CONNECTAUTOCAPTURE:
  3273.  
  3274.             Config -> CaptureConfig -> ConnectAutoCapture = Number;
  3275.  
  3276.             ConfigChanged = TRUE;
  3277.  
  3278.             break;
  3279.  
  3280.         case ATTR_PREFS_CAPTURE_AUTOCAPTUREDATE:
  3281.  
  3282.             Config -> CaptureConfig -> AutoCaptureDate = Number;
  3283.  
  3284.             ConfigChanged = TRUE;
  3285.  
  3286.             break;
  3287.  
  3288.         case ATTR_PREFS_CAPTURE_CAPTUREFILTER:
  3289.  
  3290.             Config -> CaptureConfig -> CaptureFilterMode = Number;
  3291.  
  3292.             ConfigChanged = TRUE;
  3293.  
  3294.             ConOutputUpdate();
  3295.  
  3296.             break;
  3297.  
  3298.         case ATTR_PREFS_CAPTURE_CAPTUREPATH:
  3299.  
  3300.             strcpy(Config -> CaptureConfig -> CapturePath,String);
  3301.  
  3302.             ConfigChanged = TRUE;
  3303.  
  3304.             break;
  3305.  
  3306.         case ATTR_PREFS_CAPTURE_CALLLOGFILENAME:
  3307.  
  3308.             strcpy(Config -> CaptureConfig -> CallLogFileName,String);
  3309.  
  3310.             ConfigChanged = TRUE;
  3311.  
  3312.             break;
  3313.  
  3314.         case ATTR_PREFS_CAPTURE_BUFFERSAVEPATH:
  3315.  
  3316.             strcpy(Config -> CaptureConfig -> BufferPath,String);
  3317.  
  3318.             ConfigChanged = TRUE;
  3319.  
  3320.             break;
  3321.  
  3322.         case ATTR_PREFS_CAPTURE_OPENBUFFERWINDOW:
  3323.  
  3324.             Config -> CaptureConfig -> OpenBufferWindow = Number;
  3325.  
  3326.             ConfigChanged = TRUE;
  3327.  
  3328.             break;
  3329.  
  3330.         case ATTR_PREFS_CAPTURE_OPENBUFFERSCREEN:
  3331.  
  3332.             Config -> CaptureConfig -> OpenBufferScreen = Number;
  3333.  
  3334.             ConfigChanged = TRUE;
  3335.  
  3336.             break;
  3337.  
  3338.         case ATTR_PREFS_CAPTURE_BUFFERSCREENPOSITION:
  3339.  
  3340.             Config -> CaptureConfig -> BufferScreenPosition = Number;
  3341.  
  3342.             ConfigChanged = TRUE;
  3343.  
  3344.             break;
  3345.  
  3346.         case ATTR_PREFS_CAPTURE_BUFFERWIDTH:
  3347.  
  3348.             if(Number < 80)
  3349.                 Number = 80;
  3350.  
  3351.             if(Number > 255)
  3352.                 Number = 255;
  3353.  
  3354.             Config -> CaptureConfig -> BufferWidth = Number;
  3355.  
  3356.             ConfigChanged = TRUE;
  3357.  
  3358.             break;
  3359.  
  3360.         case ATTR_PREFS_CAPTURE_SEARCH_HISTORY:
  3361.  
  3362.             if(Number < 1)
  3363.                 Number = 1;
  3364.  
  3365.             if(Number > 255)
  3366.                 Number = 255;
  3367.  
  3368.             Config -> CaptureConfig -> SearchHistory = Number;
  3369.  
  3370.             ConfigChanged = TRUE;
  3371.  
  3372.             break;
  3373.  
  3374.         case ATTR_PREFS_CAPTURE_REMEMBER_BUFFERWINDOW:
  3375.  
  3376.             Config -> CaptureConfig -> RememberBufferWindow = Number;
  3377.  
  3378.             ConfigChanged = TRUE;
  3379.  
  3380.             break;
  3381.  
  3382.         case ATTR_PREFS_CAPTURE_REMEMBER_BUFFERSCREEN:
  3383.  
  3384.             Config -> CaptureConfig -> RememberBufferScreen = Number;
  3385.  
  3386.             ConfigChanged = TRUE;
  3387.  
  3388.             break;
  3389.  
  3390.         case ATTR_PREFS_FILE_TRANSFERPROTOCOLNAME:
  3391.  
  3392.             strcpy(Config -> TransferConfig -> DefaultLibrary,String);
  3393.  
  3394.             ConfigChanged = TRUE;
  3395.  
  3396.             TransferUpdateRequired = TRUE;
  3397.  
  3398.             break;
  3399.  
  3400.         case ATTR_PREFS_FILE_TRANSLATIONFILENAME:
  3401.  
  3402.             strcpy(Config -> TranslationFileName,String);
  3403.  
  3404.             ConfigChanged = TRUE;
  3405.  
  3406.             break;
  3407.  
  3408.         case ATTR_PREFS_FILE_MACROFILENAME:
  3409.  
  3410.             strcpy(Config -> MacroFileName,String);
  3411.  
  3412.             ConfigChanged = TRUE;
  3413.  
  3414.             break;
  3415.  
  3416.         case ATTR_PREFS_FILE_CURSORFILENAME:
  3417.  
  3418.             strcpy(Config -> CursorFileName,String);
  3419.  
  3420.             ConfigChanged = TRUE;
  3421.  
  3422.             break;
  3423.  
  3424.         case ATTR_PREFS_FILE_FASTMACROFILENAME:
  3425.  
  3426.             strcpy(Config -> FastMacroFileName,String);
  3427.  
  3428.             ConfigChanged = TRUE;
  3429.  
  3430.             break;
  3431.  
  3432.         case ATTR_PREFS_EMULATION_IDENTIFICATION:
  3433.  
  3434.             Config -> EmulationConfig -> TerminalType = Number;
  3435.  
  3436.             ConfigChanged = TRUE;
  3437.  
  3438.             break;
  3439.  
  3440.         case ATTR_PREFS_EMULATION_CURSORMODE:
  3441.  
  3442.             Config -> EmulationConfig -> CursorMode = Number;
  3443.  
  3444.             ConfigChanged = TRUE;
  3445.  
  3446.             break;
  3447.  
  3448.         case ATTR_PREFS_EMULATION_MAXSCROLL:
  3449.  
  3450.             if(Number < 0)
  3451.                 Number = 0;
  3452.             else
  3453.             {
  3454.                 if(Number > 255)
  3455.                     Number = 255;
  3456.             }
  3457.  
  3458.             Config -> EmulationConfig -> MaxScroll = Number;
  3459.  
  3460.             ConfigChanged = TRUE;
  3461.  
  3462.             break;
  3463.  
  3464.         case ATTR_PREFS_EMULATION_MAXJUMP:
  3465.  
  3466.             if(Number < 0)
  3467.                 Number = 0;
  3468.             else
  3469.             {
  3470.                 if(Number > 255)
  3471.                     Number = 255;
  3472.             }
  3473.  
  3474.             Config -> EmulationConfig -> MaxJump = Number;
  3475.  
  3476.             ConfigChanged = TRUE;
  3477.  
  3478.             break;
  3479.  
  3480.         case ATTR_PREFS_EMULATION_NUMERICMODE:
  3481.  
  3482.             Config -> EmulationConfig -> NumericMode = Number;
  3483.  
  3484.             ConfigChanged = TRUE;
  3485.  
  3486.             break;
  3487.  
  3488.         case ATTR_PREFS_EMULATION_CURSORWRAP:
  3489.  
  3490.             Config -> EmulationConfig -> CursorWrap = Number;
  3491.  
  3492.             ConfigChanged = TRUE;
  3493.  
  3494.             break;
  3495.  
  3496.         case ATTR_PREFS_EMULATION_LINEWRAP:
  3497.  
  3498.             Config -> EmulationConfig -> LineWrap = Number;
  3499.  
  3500.             ConfigChanged = TRUE;
  3501.  
  3502.             break;
  3503.  
  3504.         case ATTR_PREFS_EMULATION_INSERTMODE:
  3505.  
  3506.             Config -> EmulationConfig -> InsertMode = Number;
  3507.  
  3508.             ConfigChanged = TRUE;
  3509.  
  3510.             break;
  3511.  
  3512.         case ATTR_PREFS_EMULATION_NEWLINEMODE:
  3513.  
  3514.             Config -> EmulationConfig -> NewLineMode = Number;
  3515.  
  3516.             ConfigChanged = TRUE;
  3517.  
  3518.             break;
  3519.  
  3520.         case ATTR_PREFS_EMULATION_SCROLLMODE:
  3521.  
  3522.             Config -> EmulationConfig -> ScrollMode = Number;
  3523.  
  3524.             ConfigChanged = TRUE;
  3525.  
  3526.             break;
  3527.  
  3528.         case ATTR_PREFS_EMULATION_DESTRUCTIVEBACKSPACE:
  3529.  
  3530.             Config -> EmulationConfig -> DestructiveBackspace = Number;
  3531.  
  3532.             ConfigChanged = TRUE;
  3533.  
  3534.             break;
  3535.  
  3536.         case ATTR_PREFS_EMULATION_SWAPBSDELETE:
  3537.  
  3538.             Config -> EmulationConfig -> SwapBSDelete = Number;
  3539.  
  3540.             ConfigChanged = TRUE;
  3541.  
  3542.             break;
  3543.  
  3544.         case ATTR_PREFS_EMULATION_PRINTERENABLED:
  3545.  
  3546.             Config -> EmulationConfig -> PrinterEnabled = Number;
  3547.  
  3548.             ConfigChanged = TRUE;
  3549.  
  3550.             break;
  3551.  
  3552.         case ATTR_PREFS_EMULATION_ANSWERBACKTEXT:
  3553.  
  3554.             strcpy(Config -> EmulationConfig -> AnswerBack,String);
  3555.  
  3556.             ConfigChanged = TRUE;
  3557.  
  3558.             break;
  3559.  
  3560.         case ATTR_PREFS_EMULATION_CLS_RESETS_CURSOR:
  3561.  
  3562.             Config -> EmulationConfig -> CLSResetsCursor = Number;
  3563.  
  3564.             ConfigChanged = TRUE;
  3565.  
  3566.             break;
  3567.  
  3568.         case ATTR_PREFS_EMULATION_NUMPADLOCKED:
  3569.  
  3570.             Config -> EmulationConfig -> KeysLocked = Number;
  3571.  
  3572.             ConfigChanged = TRUE;
  3573.  
  3574.             break;
  3575.  
  3576.         case ATTR_PREFS_EMULATION_WRAPLOCKED:
  3577.  
  3578.             Config -> EmulationConfig -> LockWrapping = Number;
  3579.  
  3580.             ConfigChanged = TRUE;
  3581.  
  3582.             break;
  3583.  
  3584.         case ATTR_PREFS_EMULATION_FONTLOCKED:
  3585.  
  3586.             Config -> EmulationConfig -> FontLocked = Number;
  3587.  
  3588.             ConfigChanged = TRUE;
  3589.  
  3590.             break;
  3591.  
  3592.         case ATTR_PREFS_EMULATION_CURSORLOCKED:
  3593.  
  3594.             Config -> EmulationConfig -> CursorLocked = Number;
  3595.  
  3596.             ConfigChanged = TRUE;
  3597.  
  3598.             break;
  3599.  
  3600.         case ATTR_PREFS_EMULATION_STYLELOCKED:
  3601.  
  3602.             Config -> EmulationConfig -> LockStyle = Number;
  3603.  
  3604.             ConfigChanged = TRUE;
  3605.  
  3606.             break;
  3607.  
  3608.         case ATTR_PREFS_EMULATION_COLOURLOCKED:
  3609.  
  3610.             Config -> EmulationConfig -> LockColour = Number;
  3611.  
  3612.             ConfigChanged = TRUE;
  3613.  
  3614.             break;
  3615.  
  3616.         case ATTR_PREFS_EMULATION_USEPENS:
  3617.  
  3618.             Config -> EmulationConfig -> UseStandardPens = Number;
  3619.  
  3620.             UpdateRequired = ConfigChanged = TRUE;
  3621.  
  3622.             break;
  3623.  
  3624.         case ATTR_PREFS_TRANSFER_DEFAULT_LIBRARY:
  3625.  
  3626.             strcpy(Config -> TransferConfig -> DefaultLibrary,String);
  3627.  
  3628.             ConfigChanged = TRUE;
  3629.  
  3630.             TransferUpdateRequired = TRUE;
  3631.  
  3632.             break;
  3633.  
  3634.         case ATTR_PREFS_TRANSFER_ASCII_UPLOAD_LIBRARY:
  3635.  
  3636.             strcpy(Config -> TransferConfig -> ASCIIUploadLibrary,String);
  3637.  
  3638.             UpdateRequired = ConfigChanged = TRUE;
  3639.  
  3640.             break;
  3641.  
  3642.         case ATTR_PREFS_TRANSFER_ASCII_DOWNLOAD_LIBRARY:
  3643.  
  3644.             strcpy(Config -> TransferConfig -> ASCIIDownloadLibrary,String);
  3645.  
  3646.             UpdateRequired = ConfigChanged = TRUE;
  3647.  
  3648.             break;
  3649.  
  3650.         case ATTR_PREFS_TRANSFER_TEXT_UPLOAD_LIBRARY:
  3651.  
  3652.             strcpy(Config -> TransferConfig -> TextUploadLibrary,String);
  3653.  
  3654.             UpdateRequired = ConfigChanged = TRUE;
  3655.  
  3656.             break;
  3657.  
  3658.         case ATTR_PREFS_TRANSFER_TEXT_DOWNLOAD_LIBRARY:
  3659.  
  3660.             strcpy(Config -> TransferConfig -> TextDownloadLibrary,String);
  3661.  
  3662.             UpdateRequired = ConfigChanged = TRUE;
  3663.  
  3664.             break;
  3665.  
  3666.         case ATTR_PREFS_TRANSFER_BINARY_UPLOAD_LIBRARY:
  3667.  
  3668.             strcpy(Config -> TransferConfig -> BinaryUploadLibrary,String);
  3669.  
  3670.             UpdateRequired = ConfigChanged = TRUE;
  3671.  
  3672.             break;
  3673.  
  3674.         case ATTR_PREFS_TRANSFER_BINARY_DOWNLOAD_LIBRARY:
  3675.  
  3676.             strcpy(Config -> TransferConfig -> BinaryDownloadLibrary,String);
  3677.  
  3678.             UpdateRequired = ConfigChanged = TRUE;
  3679.  
  3680.             break;
  3681.  
  3682.         case ATTR_PREFS_TRANSFER_QUIET_TRANSFER:
  3683.  
  3684.             Config -> TransferConfig -> QuietTransfer = Number;
  3685.  
  3686.             ConfigChanged = TRUE;
  3687.  
  3688.             break;
  3689.  
  3690.         case ATTR_PREFS_TRANSFER_MANGLE_FILE_NAMES:
  3691.  
  3692.             Config -> TransferConfig -> MangleFileNames = Number;
  3693.  
  3694.             ConfigChanged = TRUE;
  3695.  
  3696.             break;
  3697.  
  3698.         case ATTR_PREFS_TRANSFER_STRIP_BIT_8:
  3699.  
  3700.             Config -> TransferConfig -> StripBit8 = Number;
  3701.  
  3702.             ConfigChanged = TRUE;
  3703.  
  3704.             break;
  3705.  
  3706.         case ATTR_PREFS_TRANSFER_IGNORE_DATA_PAST_ARNOLD:
  3707.  
  3708.             Config -> TransferConfig -> IgnoreDataPastArnold = Number;
  3709.  
  3710.             ConfigChanged = TRUE;
  3711.  
  3712.             break;
  3713.  
  3714.         case ATTR_PREFS_TRANSFER_TERMINATOR_CHAR:
  3715.  
  3716.             if(Number < 0)
  3717.                 Number = 0;
  3718.             else
  3719.             {
  3720.                 if(Number > 255)
  3721.                     Number = 255;
  3722.             }
  3723.  
  3724.             Config -> TransferConfig -> TerminatorChar = Number;
  3725.  
  3726.             ConfigChanged = TRUE;
  3727.  
  3728.             break;
  3729.  
  3730.         case ATTR_PREFS_TRANSFER_LINEDELAY:
  3731.  
  3732.             if(Number < 0)
  3733.                 Error = ERROR_BAD_NUMBER;
  3734.             else
  3735.             {
  3736.                 Config -> TransferConfig -> LineDelay = Number;
  3737.  
  3738.                 ConfigChanged = TRUE;
  3739.             }
  3740.  
  3741.             break;
  3742.  
  3743.         case ATTR_PREFS_TRANSFER_CHARDELAY:
  3744.  
  3745.             if(Number < 0)
  3746.                 Error = ERROR_BAD_NUMBER;
  3747.             else
  3748.             {
  3749.                 Config -> TransferConfig -> CharDelay = Number;
  3750.  
  3751.                 ConfigChanged = TRUE;
  3752.             }
  3753.  
  3754.             break;
  3755.  
  3756.         case ATTR_PREFS_TRANSFER_LINEPROMPT:
  3757.  
  3758.             strcpy(Config -> TransferConfig -> LinePrompt,String);
  3759.  
  3760.             ConfigChanged = TRUE;
  3761.  
  3762.             break;
  3763.  
  3764.         case ATTR_PREFS_TRANSFER_TEXTPACING:
  3765.  
  3766.             Config -> TransferConfig -> PacingMode = Number;
  3767.  
  3768.             ConfigChanged = TRUE;
  3769.  
  3770.             break;
  3771.  
  3772.         case ATTR_PREFS_TRANSFER_SENDTIMEOUT:
  3773.  
  3774.             Config -> TransferConfig -> SendTimeout = Number;
  3775.  
  3776.             ConfigChanged = TRUE;
  3777.  
  3778.             break;
  3779.  
  3780.         case ATTR_PREFS_TRANSFER_ERROR_NOTIFY_COUNT:
  3781.  
  3782.             Config -> TransferConfig -> ErrorNotification = Number;
  3783.  
  3784.             ConfigChanged = TRUE;
  3785.  
  3786.             break;
  3787.  
  3788.         case ATTR_PREFS_TRANSFER_ERROR_NOTIFY_WHEN:
  3789.  
  3790.             Config -> TransferConfig -> TransferNotification = Number;
  3791.  
  3792.             ConfigChanged = TRUE;
  3793.  
  3794.             break;
  3795.  
  3796.         case ATTR_PREFS_TRANSFER_DEFAULT_TYPE:
  3797.  
  3798.             Config -> TransferConfig -> DefaultType = Number;
  3799.  
  3800.             ConfigChanged    = TRUE;
  3801.             UpdateRequired    = TRUE;
  3802.  
  3803.             break;
  3804.  
  3805.         case ATTR_PREFS_TRANSFER_ASCII_UPLOAD_TYPE:
  3806.  
  3807.             Config -> TransferConfig -> ASCIIUploadType = Number;
  3808.  
  3809.             ConfigChanged    = TRUE;
  3810.             UpdateRequired    = TRUE;
  3811.  
  3812.             break;
  3813.  
  3814.         case ATTR_PREFS_TRANSFER_ASCII_DOWNLOAD_TYPE:
  3815.  
  3816.             Config -> TransferConfig -> ASCIIDownloadType = Number;
  3817.  
  3818.             ConfigChanged    = TRUE;
  3819.             UpdateRequired    = TRUE;
  3820.  
  3821.             break;
  3822.  
  3823.         case ATTR_PREFS_TRANSFER_TEXT_UPLOAD_TYPE:
  3824.  
  3825.             Config -> TransferConfig -> TextUploadType = Number;
  3826.  
  3827.             ConfigChanged    = TRUE;
  3828.             UpdateRequired    = TRUE;
  3829.  
  3830.             break;
  3831.  
  3832.         case ATTR_PREFS_TRANSFER_TEXT_DOWNLOAD_TYPE:
  3833.  
  3834.             Config -> TransferConfig -> TextDownloadType = Number;
  3835.  
  3836.             ConfigChanged    = TRUE;
  3837.             UpdateRequired    = TRUE;
  3838.  
  3839.             break;
  3840.  
  3841.         case ATTR_PREFS_TRANSFER_BINARY_UPLOAD_TYPE:
  3842.  
  3843.             Config -> TransferConfig -> BinaryUploadType = Number;
  3844.  
  3845.             ConfigChanged    = TRUE;
  3846.             UpdateRequired    = TRUE;
  3847.  
  3848.             break;
  3849.  
  3850.         case ATTR_PREFS_TRANSFER_BINARY_DOWNLOAD_TYPE:
  3851.  
  3852.             Config -> TransferConfig -> BinaryDownloadType = Number;
  3853.  
  3854.             ConfigChanged    = TRUE;
  3855.             UpdateRequired    = TRUE;
  3856.  
  3857.             break;
  3858.  
  3859.         case ATTR_PREFS_TRANSFER_DEFAULT_SEND_SIGNATURE:
  3860.  
  3861.             Config -> TransferConfig -> Signatures[TRANSFERSIG_DEFAULTUPLOAD] . Length = TranslateString(String,Config -> TransferConfig -> Signatures[TRANSFERSIG_DEFAULTUPLOAD] . Signature);
  3862.  
  3863.             ConfigChanged    = TRUE;
  3864.             UpdateRequired    = TRUE;
  3865.  
  3866.             break;
  3867.  
  3868.         case ATTR_PREFS_TRANSFER_DEFAULT_RECEIVE_SIGNATURE:
  3869.  
  3870.             Config -> TransferConfig -> Signatures[TRANSFERSIG_DEFAULTDOWNLOAD] . Length = TranslateString(String,Config -> TransferConfig -> Signatures[TRANSFERSIG_DEFAULTDOWNLOAD] . Signature);
  3871.  
  3872.             ConfigChanged    = TRUE;
  3873.             UpdateRequired    = TRUE;
  3874.  
  3875.             break;
  3876.  
  3877.         case ATTR_PREFS_TRANSFER_TEXT_UPLOAD_SIGNATURE:
  3878.  
  3879.             Config -> TransferConfig -> Signatures[TRANSFERSIG_TEXTUPLOAD] . Length = TranslateString(String,Config -> TransferConfig -> Signatures[TRANSFERSIG_TEXTUPLOAD] . Signature);
  3880.  
  3881.             ConfigChanged    = TRUE;
  3882.             UpdateRequired    = TRUE;
  3883.  
  3884.             break;
  3885.  
  3886.         case ATTR_PREFS_TRANSFER_TEXT_DOWNLOAD_SIGNATURE:
  3887.  
  3888.             Config -> TransferConfig -> Signatures[TRANSFERSIG_TEXTDOWNLOAD] . Length = TranslateString(String,Config -> TransferConfig -> Signatures[TRANSFERSIG_TEXTDOWNLOAD] . Signature);
  3889.  
  3890.             ConfigChanged    = TRUE;
  3891.             UpdateRequired    = TRUE;
  3892.  
  3893.             break;
  3894.  
  3895.         case ATTR_PREFS_TRANSFER_BINARY_UPLOAD_SIGNATURE:
  3896.  
  3897.             Config -> TransferConfig -> Signatures[TRANSFERSIG_BINARYUPLOAD] . Length = TranslateString(String,Config -> TransferConfig -> Signatures[TRANSFERSIG_BINARYUPLOAD] . Signature);
  3898.  
  3899.             ConfigChanged    = TRUE;
  3900.             UpdateRequired    = TRUE;
  3901.  
  3902.             break;
  3903.  
  3904.         case ATTR_PREFS_TRANSFER_BINARY_DOWNLOAD_SIGNATURE:
  3905.  
  3906.             Config -> TransferConfig -> Signatures[TRANSFERSIG_BINARYDOWNLOAD] . Length = TranslateString(String,Config -> TransferConfig -> Signatures[TRANSFERSIG_BINARYDOWNLOAD] . Signature);
  3907.  
  3908.             ConfigChanged    = TRUE;
  3909.             UpdateRequired    = TRUE;
  3910.  
  3911.             break;
  3912.  
  3913.         case ATTR_PREFS_SPEECH_RATE:
  3914.  
  3915.             if(Number < MINRATE)
  3916.                 Number = MINRATE;
  3917.  
  3918.             if(Number > MAXRATE)
  3919.                 Number = MAXRATE;
  3920.  
  3921.             SpeechConfig . Rate = Number;
  3922.  
  3923.             SpeechChanged = TRUE;
  3924.  
  3925.             break;
  3926.  
  3927.         case ATTR_PREFS_SPEECH_PITCH:
  3928.  
  3929.             if(Number < MINPITCH)
  3930.                 Number = MINPITCH;
  3931.  
  3932.             if(Number > MAXPITCH)
  3933.                 Number = MAXPITCH;
  3934.  
  3935.             SpeechConfig . Pitch = Number;
  3936.  
  3937.             SpeechChanged = TRUE;
  3938.  
  3939.             break;
  3940.  
  3941.         case ATTR_PREFS_SPEECH_FREQUENCY:
  3942.  
  3943.             if(Number < MINFREQ)
  3944.                 Number = MINFREQ;
  3945.  
  3946.             if(Number > MAXFREQ)
  3947.                 Number = MAXFREQ;
  3948.  
  3949.             SpeechConfig . Frequency = Number;
  3950.  
  3951.             SpeechChanged = TRUE;
  3952.  
  3953.             break;
  3954.  
  3955.         case ATTR_PREFS_SPEECH_SEXMODE:
  3956.  
  3957.             SpeechConfig . Sex = Number;
  3958.  
  3959.             SpeechChanged = TRUE;
  3960.  
  3961.             break;
  3962.  
  3963.         case ATTR_PREFS_SPEECH_VOLUME:
  3964.  
  3965.             if(Number < 0)
  3966.                 Number = 0;
  3967.  
  3968.             Number = (64 * Number) / 100;
  3969.  
  3970.             if(Number > 64)
  3971.                 Number = 64;
  3972.  
  3973.             SpeechConfig . Volume = Number;
  3974.  
  3975.             SpeechChanged = TRUE;
  3976.  
  3977.             break;
  3978.  
  3979.         case ATTR_PREFS_SPEECH_SPEECH:
  3980.  
  3981.             SpeechConfig . Enabled = Number;
  3982.  
  3983.             SpeechChanged = TRUE;
  3984.  
  3985.             break;
  3986.  
  3987.         case ATTR_PREFS_TRANSLATIONS_X_SEND:
  3988.  
  3989.             if(Count1 < 0 || Count1 > 255)
  3990.                 Error = TERMERROR_INDEX_OUT_OF_RANGE;
  3991.             else
  3992.             {
  3993.                 if(SendTable && *String)
  3994.                 {
  3995.                     struct TranslationEntry *Entry = AllocTranslationEntry(String);
  3996.  
  3997.                     if(Entry)
  3998.                     {
  3999.                         if(SendTable[Count1])
  4000.                             FreeTranslationEntry(SendTable[Count1]);
  4001.  
  4002.                         SendTable[Count1] = Entry;
  4003.  
  4004.                         TranslationChanged = TRUE;
  4005.                     }
  4006.                     else
  4007.                         Error = ERROR_NO_FREE_STORE;
  4008.                 }
  4009.                 else
  4010.                     Error = TERMERROR_NO_DATA_TO_PROCESS;
  4011.             }
  4012.  
  4013.             UpdateRequired = FALSE;
  4014.  
  4015.             break;
  4016.  
  4017.         case ATTR_PREFS_TRANSLATIONS_X_RECEIVE:
  4018.  
  4019.             if(Count1 < 0 || Count1 > 255)
  4020.                 Error = TERMERROR_INDEX_OUT_OF_RANGE;
  4021.             else
  4022.             {
  4023.                 if(ReceiveTable && *String)
  4024.                 {
  4025.                     struct TranslationEntry *Entry = AllocTranslationEntry(String);
  4026.  
  4027.                     if(Entry)
  4028.                     {
  4029.                         if(ReceiveTable[Count1])
  4030.                             FreeTranslationEntry(ReceiveTable[Count1]);
  4031.  
  4032.                         ReceiveTable[Count1] = Entry;
  4033.  
  4034.                         TranslationChanged = TRUE;
  4035.                     }
  4036.                     else
  4037.                         Error = ERROR_NO_FREE_STORE;
  4038.                 }
  4039.                 else
  4040.                     Error = TERMERROR_NO_DATA_TO_PROCESS;
  4041.             }
  4042.  
  4043.             UpdateRequired = FALSE;
  4044.  
  4045.             break;
  4046.  
  4047.         case ATTR_PREFS_FASTMACROS_X_NAME:
  4048.  
  4049.             if(Count1 < FastMacroCount && Count1 >= 0)
  4050.             {
  4051.                 struct MacroNode *Node = (struct MacroNode *)GetListNode(Count1,&FastMacroList);
  4052.  
  4053.                 strcpy(Node -> mn_Macro,String);
  4054.  
  4055.                 FastMacrosChanged = TRUE;
  4056.             }
  4057.             else
  4058.                 Error = TERMERROR_INDEX_OUT_OF_RANGE;
  4059.  
  4060.             UpdateRequired = FALSE;
  4061.  
  4062.             break;
  4063.  
  4064.         case ATTR_PREFS_FASTMACROS_X_CODE:
  4065.  
  4066.             if(Count1 < FastMacroCount && Count1 >= 0)
  4067.             {
  4068.                 struct MacroNode *Node = (struct MacroNode *)GetListNode(Count1,&FastMacroList);
  4069.  
  4070.                 strcpy(Node -> mn_Code,String);
  4071.  
  4072.                 FastMacrosChanged = TRUE;
  4073.             }
  4074.             else
  4075.                 Error = TERMERROR_INDEX_OUT_OF_RANGE;
  4076.  
  4077.             UpdateRequired = FALSE;
  4078.  
  4079.             break;
  4080.  
  4081.         case ATTR_PREFS_HOTKEYS_TERMSCREENTOFRONTTEXT:
  4082.  
  4083.             strcpy(Hotkeys . termScreenToFront,String);
  4084.  
  4085.             HotkeysChanged = TRUE;
  4086.  
  4087.             break;
  4088.  
  4089.         case ATTR_PREFS_HOTKEYS_BUFFERSCREENTOFRONTTEXT:
  4090.  
  4091.             strcpy(Hotkeys . BufferScreenToFront,String);
  4092.  
  4093.             HotkeysChanged = TRUE;
  4094.  
  4095.             break;
  4096.  
  4097.         case ATTR_PREFS_HOTKEYS_SKIPDIALENTRYTEXT:
  4098.  
  4099.             strcpy(Hotkeys . SkipDialEntry,String);
  4100.  
  4101.             HotkeysChanged = TRUE;
  4102.  
  4103.             break;
  4104.  
  4105.         case ATTR_PREFS_HOTKEYS_ABORTAREXX:
  4106.  
  4107.             strcpy(Hotkeys . AbortARexx,String);
  4108.  
  4109.             HotkeysChanged = TRUE;
  4110.  
  4111.             break;
  4112.  
  4113.         case ATTR_PREFS_HOTKEYS_COMMODITYPRIORITY:
  4114.  
  4115.             if(Number < -128)
  4116.                 Number = -128;
  4117.  
  4118.             if(Number > 127)
  4119.                 Number = 127;
  4120.  
  4121.             Hotkeys . CommodityPriority = Number;
  4122.  
  4123.             HotkeysChanged = TRUE;
  4124.  
  4125.             break;
  4126.  
  4127.         case ATTR_PREFS_HOTKEYS_HOTKEYSENABLED:
  4128.  
  4129.             Hotkeys . HotkeysEnabled = Number;
  4130.  
  4131.             HotkeysChanged = TRUE;
  4132.  
  4133.             break;
  4134.  
  4135.         case ATTR_PREFS_CURSORKEYS_UPTEXT:
  4136.  
  4137.             strcpy(CursorKeys -> Keys[0][0],String);
  4138.  
  4139.             CursorKeysChanged = TRUE;
  4140.  
  4141.             UpdateRequired = FALSE;
  4142.  
  4143.             break;
  4144.  
  4145.         case ATTR_PREFS_CURSORKEYS_RIGHTTEXT:
  4146.  
  4147.             strcpy(CursorKeys -> Keys[0][1],String);
  4148.  
  4149.             CursorKeysChanged = TRUE;
  4150.  
  4151.             UpdateRequired = FALSE;
  4152.  
  4153.             break;
  4154.  
  4155.         case ATTR_PREFS_CURSORKEYS_DOWNTEXT:
  4156.  
  4157.             strcpy(CursorKeys -> Keys[0][2],String);
  4158.  
  4159.             CursorKeysChanged = TRUE;
  4160.  
  4161.             UpdateRequired = FALSE;
  4162.  
  4163.             break;
  4164.  
  4165.         case ATTR_PREFS_CURSORKEYS_LEFTTEXT:
  4166.  
  4167.             strcpy(CursorKeys -> Keys[0][3],String);
  4168.  
  4169.             CursorKeysChanged = TRUE;
  4170.  
  4171.             UpdateRequired = FALSE;
  4172.  
  4173.             break;
  4174.  
  4175.         case ATTR_PREFS_CURSORKEYS_SHIFT_UPTEXT:
  4176.  
  4177.             strcpy(CursorKeys -> Keys[1][0],String);
  4178.  
  4179.             CursorKeysChanged = TRUE;
  4180.  
  4181.             UpdateRequired = FALSE;
  4182.  
  4183.             break;
  4184.  
  4185.         case ATTR_PREFS_CURSORKEYS_SHIFT_RIGHTTEXT:
  4186.  
  4187.             strcpy(CursorKeys -> Keys[1][1],String);
  4188.  
  4189.             CursorKeysChanged = TRUE;
  4190.  
  4191.             UpdateRequired = FALSE;
  4192.  
  4193.             break;
  4194.  
  4195.         case ATTR_PREFS_CURSORKEYS_SHIFT_DOWNTEXT:
  4196.  
  4197.             strcpy(CursorKeys -> Keys[1][2],String);
  4198.  
  4199.             CursorKeysChanged = TRUE;
  4200.  
  4201.             UpdateRequired = FALSE;
  4202.  
  4203.             break;
  4204.  
  4205.         case ATTR_PREFS_CURSORKEYS_SHIFT_LEFTTEXT:
  4206.  
  4207.             strcpy(CursorKeys -> Keys[1][3],String);
  4208.  
  4209.             CursorKeysChanged = TRUE;
  4210.  
  4211.             UpdateRequired = FALSE;
  4212.  
  4213.             break;
  4214.  
  4215.         case ATTR_PREFS_CURSORKEYS_ALT_UPTEXT:
  4216.  
  4217.             strcpy(CursorKeys -> Keys[2][0],String);
  4218.  
  4219.             CursorKeysChanged = TRUE;
  4220.  
  4221.             UpdateRequired = FALSE;
  4222.  
  4223.             break;
  4224.  
  4225.         case ATTR_PREFS_CURSORKEYS_ALT_RIGHTTEXT:
  4226.  
  4227.             strcpy(CursorKeys -> Keys[2][1],String);
  4228.  
  4229.             CursorKeysChanged = TRUE;
  4230.  
  4231.             UpdateRequired = FALSE;
  4232.  
  4233.             break;
  4234.  
  4235.         case ATTR_PREFS_CURSORKEYS_ALT_DOWNTEXT:
  4236.  
  4237.             strcpy(CursorKeys -> Keys[2][2],String);
  4238.  
  4239.             CursorKeysChanged = TRUE;
  4240.  
  4241.             UpdateRequired = FALSE;
  4242.  
  4243.             break;
  4244.  
  4245.         case ATTR_PREFS_CURSORKEYS_ALT_LEFTTEXT:
  4246.  
  4247.             strcpy(CursorKeys -> Keys[2][3],String);
  4248.  
  4249.             CursorKeysChanged = TRUE;
  4250.  
  4251.             UpdateRequired = FALSE;
  4252.  
  4253.             break;
  4254.  
  4255.         case ATTR_PREFS_CURSORKEYS_CONTROL_UPTEXT:
  4256.  
  4257.             strcpy(CursorKeys -> Keys[3][0],String);
  4258.  
  4259.             CursorKeysChanged = TRUE;
  4260.  
  4261.             UpdateRequired = FALSE;
  4262.  
  4263.             break;
  4264.  
  4265.         case ATTR_PREFS_CURSORKEYS_CONTROL_RIGHTTEXT:
  4266.  
  4267.             strcpy(CursorKeys -> Keys[3][1],String);
  4268.  
  4269.             CursorKeysChanged = TRUE;
  4270.  
  4271.             UpdateRequired = FALSE;
  4272.  
  4273.             break;
  4274.  
  4275.         case ATTR_PREFS_CURSORKEYS_CONTROL_DOWNTEXT:
  4276.  
  4277.             strcpy(CursorKeys -> Keys[3][2],String);
  4278.  
  4279.             CursorKeysChanged = TRUE;
  4280.  
  4281.             UpdateRequired = FALSE;
  4282.  
  4283.             break;
  4284.  
  4285.         case ATTR_PREFS_CURSORKEYS_CONTROL_LEFTTEXT:
  4286.  
  4287.             strcpy(CursorKeys -> Keys[3][3],String);
  4288.  
  4289.             CursorKeysChanged = TRUE;
  4290.  
  4291.             UpdateRequired = FALSE;
  4292.  
  4293.             break;
  4294.  
  4295.         case ATTR_PREFS_FUNCTIONKEYS_X:
  4296.  
  4297.             if(Count1 >= 1 && Count1 <= 10)
  4298.             {
  4299.                 strcpy(MacroKeys -> Keys[0][Count1 - 1],String);
  4300.  
  4301.                 MacroChanged = TRUE;
  4302.             }
  4303.             else
  4304.                 Error = TERMERROR_INDEX_OUT_OF_RANGE;
  4305.  
  4306.             UpdateRequired = FALSE;
  4307.  
  4308.             break;
  4309.  
  4310.         case ATTR_PREFS_FUNCTIONKEYS_SHIFT_X:
  4311.  
  4312.             if(Count1 >= 1 && Count1 <= 10)
  4313.             {
  4314.                 strcpy(MacroKeys -> Keys[1][Count1 - 1],String);
  4315.  
  4316.                 MacroChanged = TRUE;
  4317.             }
  4318.             else
  4319.                 Error = TERMERROR_INDEX_OUT_OF_RANGE;
  4320.  
  4321.             UpdateRequired = FALSE;
  4322.  
  4323.             break;
  4324.  
  4325.         case ATTR_PREFS_FUNCTIONKEYS_ALT_X:
  4326.  
  4327.             if(Count1 >= 1 && Count1 <= 10)
  4328.             {
  4329.                 strcpy(MacroKeys -> Keys[2][Count1 - 1],String);
  4330.  
  4331.                 MacroChanged = TRUE;
  4332.             }
  4333.             else
  4334.                 Error = TERMERROR_INDEX_OUT_OF_RANGE;
  4335.  
  4336.             UpdateRequired = FALSE;
  4337.  
  4338.             break;
  4339.  
  4340.         case ATTR_PREFS_FUNCTIONKEYS_CONTROL_X:
  4341.  
  4342.             if(Count1 >= 1 && Count1 <= 10)
  4343.             {
  4344.                 strcpy(MacroKeys -> Keys[3][Count1 - 1],String);
  4345.  
  4346.                 MacroChanged = TRUE;
  4347.             }
  4348.             else
  4349.                 Error = TERMERROR_INDEX_OUT_OF_RANGE;
  4350.  
  4351.             UpdateRequired = FALSE;
  4352.  
  4353.             break;
  4354.  
  4355.         case ATTR_PREFS_PROTOCOL:
  4356.  
  4357.             strcpy(ProtocolOptsBuffer,String);
  4358.  
  4359.             TransferUpdateRequired = TRUE;
  4360.  
  4361.             UpdateRequired = FALSE;
  4362.  
  4363.             break;
  4364.  
  4365.         case ATTR_PREFS_CONSOLE:
  4366.  
  4367.             strcpy(WindowName,String);
  4368.  
  4369.             UpdateRequired = FALSE;
  4370.  
  4371.             break;
  4372.  
  4373.         case ATTR_PREFS_SOUND_BELLNAME:
  4374.  
  4375.             strcpy(SoundConfig . BellFile,String);
  4376.  
  4377.             SoundChanged = TRUE;
  4378.  
  4379.             break;
  4380.  
  4381.         case ATTR_PREFS_SOUND_ERROR:
  4382.  
  4383.             strcpy(SoundConfig . ErrorNotifyFile,String);
  4384.  
  4385.             SoundChanged = TRUE;
  4386.  
  4387.             break;
  4388.  
  4389.         case ATTR_PREFS_SOUND_CONNECTNAME:
  4390.  
  4391.             strcpy(SoundConfig . ConnectFile,String);
  4392.  
  4393.             SoundChanged = TRUE;
  4394.  
  4395.             break;
  4396.  
  4397.         case ATTR_PREFS_SOUND_DISCONNECTNAME:
  4398.  
  4399.             strcpy(SoundConfig . DisconnectFile,String);
  4400.  
  4401.             SoundChanged = TRUE;
  4402.  
  4403.             break;
  4404.  
  4405.         case ATTR_PREFS_SOUND_GOODTRANSFERNAME:
  4406.  
  4407.             strcpy(SoundConfig . GoodTransferFile,String);
  4408.  
  4409.             SoundChanged = TRUE;
  4410.  
  4411.             break;
  4412.  
  4413.         case ATTR_PREFS_SOUND_BADTRANSFERNAME:
  4414.  
  4415.             strcpy(SoundConfig . BadTransferFile,String);
  4416.  
  4417.             SoundChanged = TRUE;
  4418.  
  4419.             break;
  4420.  
  4421.         case ATTR_PREFS_SOUND_RINGNAME:
  4422.  
  4423.             strcpy(SoundConfig . RingFile,String);
  4424.  
  4425.             SoundChanged = TRUE;
  4426.  
  4427.             break;
  4428.  
  4429.         case ATTR_PREFS_SOUND_VOICENAME:
  4430.  
  4431.             strcpy(SoundConfig . VoiceFile,String);
  4432.  
  4433.             SoundChanged = TRUE;
  4434.  
  4435.             break;
  4436.  
  4437.         case ATTR_PREFS_SOUND_PRELOAD:
  4438.  
  4439.             SoundConfig . Preload = Number;
  4440.  
  4441.             SoundChanged = TRUE;
  4442.  
  4443.             break;
  4444.  
  4445.         case ATTR_PREFS_SOUND_VOLUME:
  4446.  
  4447.             if(Number < 0)
  4448.                 Number = 0;
  4449.             else
  4450.             {
  4451.                 if(Number > 100)
  4452.                     Number = 100;
  4453.             }
  4454.  
  4455.             SoundConfig . Volume = Number;
  4456.  
  4457.             SoundChanged = TRUE;
  4458.  
  4459.             break;
  4460.     }
  4461.  
  4462.     if(Error)
  4463.         UpdateRequired = FALSE;
  4464.  
  4465.     return(Error);
  4466. }
  4467.  
  4468.     /* Cheap shortcut :-) */
  4469.  
  4470. #define Args    Pkt -> Array
  4471. #define Results    Pkt -> Results
  4472.  
  4473.     /* RexxGetAttr(struct RexxPkt *Pkt):
  4474.      *
  4475.      *    Get some global variable(s). Care to rewrite this beastie to
  4476.      *    work recursively?
  4477.      */
  4478.  
  4479. STRPTR
  4480. RexxGetAttr(struct RexxPkt *Pkt)
  4481. {
  4482.     enum    {    ARG_GETATTR_OBJECT,ARG_GETATTR_FIELD,ARG_GETATTR_STEM,
  4483.             ARG_GETATTR_VAR };
  4484.  
  4485.     UBYTE SrcName[160];
  4486.     WORD Index,Count1,Count2;
  4487.  
  4488.     if(Args[ARG_GETATTR_FIELD])
  4489.         SPrintf(SrcName,"%s.%s",Args[ARG_GETATTR_OBJECT],Args[ARG_GETATTR_FIELD]);
  4490.     else
  4491.         strcpy(SrcName,Args[ARG_GETATTR_OBJECT]);
  4492.  
  4493.     DB(kprintf("srcname=|%s|\n",SrcName));
  4494.  
  4495.     if((Index = ToIndex(SrcName,&Count1,&Count2)) == -1)
  4496.     {
  4497.         DB(kprintf("->unknown object\n"));
  4498.  
  4499.         Results[0] = RC_ERROR;
  4500.         Results[1] = TERMERROR_UNKNOWN_OBJECT;
  4501.     }
  4502.     else
  4503.     {
  4504.         UBYTE DstName[160];
  4505.  
  4506.         DB(kprintf("item is index=%ld count1=%ld count2=%ld name |%s|\n",Index,Count1,Count2,AttributeTable[Index] . Name ? AttributeTable[Index] . Name : (STRPTR)"«NULL»"));
  4507.  
  4508.         if(AttributeTable[Index] . Type == INFO_STEM)
  4509.         {
  4510.             DB(kprintf("this is a stem variable\n"));
  4511.  
  4512.             if(!Args[ARG_GETATTR_STEM])
  4513.             {
  4514.                 DB(kprintf("->no stem var provided\n"));
  4515.  
  4516.                 Results[0] = RC_ERROR;
  4517.                 Results[1] = TERMERROR_RESULT_VARIABLE_REQUIRED;
  4518.             }
  4519.             else
  4520.             {
  4521.                 STRPTR    Result;
  4522.                 LONG    Level,Max,Min = 0;
  4523.  
  4524.                 strcpy(DstName,Args[ARG_GETATTR_STEM]);
  4525.  
  4526.                 DB(kprintf("dstname=|%s|\n",DstName));
  4527.  
  4528.                 Level = AttributeTable[Index] . Level;
  4529.  
  4530.                 DB(kprintf("list level %ld\n",Level));
  4531.  
  4532.                 do
  4533.                 {
  4534.                     if(AttributeTable[Index] . Name)
  4535.                     {
  4536.                         if(AttributeTable[Index] . Type != INFO_STEM)
  4537.                         {
  4538.                             Forbid();
  4539.  
  4540.                             DB(kprintf("reading item |%s|\n",AttributeTable[Index].Name));
  4541.  
  4542.                             if(Results[1] = GetSingleAttribute(AttributeTable[Index] . NodeID,Index,Count1,&Result))
  4543.                             {
  4544.                                 DB(kprintf("->error reading it\n"));
  4545.  
  4546.                                 Results[0] = RC_ERROR;
  4547.  
  4548.                                 Permit();
  4549.  
  4550.                                 break;
  4551.                             }
  4552.                             else
  4553.                             {
  4554.                                 if(!AttributeTable[Index + 1] . Name)
  4555.                                     Max = Atol(Result);
  4556.  
  4557.                                 DB(kprintf("storing in |%s.%s|\n",DstName,FromIndex(Index,Count1,0,FALSE)));
  4558.  
  4559.                                 if(!CreateVarArgs(Result,Pkt,"%s.%s",DstName,FromIndex(Index,Count1,0,FALSE)))
  4560.                                 {
  4561.                                     DB(kprintf("->could not create var\n"));
  4562.  
  4563.                                     Permit();
  4564.  
  4565.                                     break;
  4566.                                 }
  4567.                             }
  4568.  
  4569.                             Permit();
  4570.                         }
  4571.                         else
  4572.                         {
  4573.                             if(!AttributeTable[Index + 1] . Name)
  4574.                             {
  4575.                                     /* Special cases! */
  4576.  
  4577.                                 switch(AttributeTable[Index] . NodeID)
  4578.                                 {
  4579.                                     case ATTR_PREFS_TRANSLATIONS:
  4580.  
  4581.                                         Max = 256;
  4582.                                         break;
  4583.  
  4584.                                     case ATTR_PREFS_FUNCTIONKEYS:
  4585.                                     case ATTR_PREFS_FUNCTIONKEYS_SHIFT:
  4586.                                     case ATTR_PREFS_FUNCTIONKEYS_ALT:
  4587.                                     case ATTR_PREFS_FUNCTIONKEYS_CONTROL:
  4588.  
  4589.                                         Max = 11;
  4590.                                         Min = 1;
  4591.                                         break;
  4592.  
  4593.                                     default:
  4594.  
  4595.                                         Forbid();
  4596.  
  4597.                                         if(Results[1] = GetSingleAttribute(AttributeTable[Index] . NodeID,Index,Count1,&Result))
  4598.                                         {
  4599.                                             Permit();
  4600.  
  4601.                                             Results[0] = RC_ERROR;
  4602.  
  4603.                                             break;
  4604.                                         }
  4605.                                         else
  4606.                                             Max = Atol(Result);
  4607.  
  4608.                                         Permit();
  4609.  
  4610.                                         break;
  4611.                                 }
  4612.                             }
  4613.                         }
  4614.                     }
  4615.                     else
  4616.                     {
  4617.                         LONG i,j;
  4618.  
  4619.                         DB(kprintf("reading items %ld through %ld\n",Min,Max - 1));
  4620.  
  4621.                         for(i = Min ; i < Max ; i++)
  4622.                         {
  4623.                             j = 0;
  4624.  
  4625.                             do
  4626.                             {
  4627.                                 if(AttributeTable[Index + j] . Type != INFO_STEM)
  4628.                                 {
  4629.                                     Forbid();
  4630.  
  4631.                                     DB(kprintf("reading item %ld\n",AttributeTable[Index + j] . NodeID));
  4632.  
  4633.                                     if(Results[1] = GetSingleAttribute(AttributeTable[Index + j] . NodeID,Index + j,i,&Result))
  4634.                                     {
  4635.                                         DB(kprintf("->error reading it\n"));
  4636.  
  4637.                                         Permit();
  4638.  
  4639.                                         Results[0] = RC_ERROR;
  4640.  
  4641.                                         break;
  4642.                                     }
  4643.                                     else
  4644.                                     {
  4645.                                         DB(kprintf("storing it in |%s.%s|\n",DstName,FromIndex(Index + j,i,0,FALSE)));
  4646.  
  4647.                                         if(!CreateVarArgs(Result,Pkt,"%s.%s",DstName,FromIndex(Index + j,i,0,FALSE)))
  4648.                                         {
  4649.                                             Permit();
  4650.  
  4651.                                             break;
  4652.                                         }
  4653.                                     }
  4654.  
  4655.                                     Permit();
  4656.                                 }
  4657.  
  4658.                                 j++;
  4659.                             }
  4660.                             while(AttributeTable[Index + j] . Level > Level && !Results[0]);
  4661.                         }
  4662.  
  4663.                         while(AttributeTable[Index + 1] . Level > Level)
  4664.                             Index++;
  4665.  
  4666.                         Min = 0;
  4667.  
  4668.                         if(Results[0])
  4669.                             break;
  4670.                     }
  4671.  
  4672.                     Index++;
  4673.                 }
  4674.                 while(Index < AttributeTableSize && AttributeTable[Index] . Level > Level);
  4675.             }
  4676.         }
  4677.         else
  4678.         {
  4679.             STRPTR Result;
  4680.  
  4681.             if(Args[ARG_GETATTR_STEM])
  4682.                 SPrintf(DstName,"%s.%s",Args[ARG_GETATTR_STEM],SrcName);
  4683.             else
  4684.             {
  4685.                 if(Args[ARG_GETATTR_VAR])
  4686.                     strcpy(DstName,Args[ARG_GETATTR_VAR]);
  4687.                 else
  4688.                     DstName[0] = 0;
  4689.             }
  4690.  
  4691.             DB(kprintf("dstname=|%s|\n",DstName));
  4692.  
  4693.             Forbid();
  4694.  
  4695.             if(Results[1] = GetSingleAttribute(AttributeTable[Index] . NodeID,Index,Count1,&Result))
  4696.             {
  4697.                 Results[0] = RC_ERROR;
  4698.                 DB(kprintf("->could not read attr\n"));
  4699.             }
  4700.             else
  4701.             {
  4702.                 if(DstName[0])
  4703.                 {
  4704.                     DB(kprintf("storing in variable |%s|\n",DstName));
  4705.                     CreateVar(Result,Pkt,DstName);
  4706.                 }
  4707.                 else
  4708.                 {
  4709.                     Permit();
  4710.  
  4711.                     DB(kprintf("returning in |RESULT|\n"));
  4712.  
  4713.                     return(CreateResult(Result,Results));
  4714.                 }
  4715.             }
  4716.  
  4717.             Permit();
  4718.         }
  4719.     }
  4720.  
  4721.     return(NULL);
  4722. }
  4723.  
  4724.     /* RexxSetAttr(struct RexxPkt *Pkt):
  4725.      *
  4726.      *    Set some global variable(s). Care to rewrite this beastie to
  4727.      *    work recursively?
  4728.      */
  4729.  
  4730. STRPTR
  4731. RexxSetAttr(struct RexxPkt *Pkt)
  4732. {
  4733.     enum    {    ARG_SETATTR_OBJECT,ARG_SETATTR_FIELD,ARG_SETATTR_STEM,
  4734.             ARG_SETATTR_VAR };
  4735.  
  4736.     UBYTE SrcName[160];
  4737.     WORD Index,Count1,Count2;
  4738.  
  4739.     if(Args[ARG_SETATTR_FIELD])
  4740.         SPrintf(SrcName,"%s.%s",Args[ARG_SETATTR_OBJECT],Args[ARG_SETATTR_FIELD]);
  4741.     else
  4742.         strcpy(SrcName,Args[ARG_SETATTR_OBJECT]);
  4743.  
  4744.     if((Index = ToIndex(SrcName,&Count1,&Count2)) == -1)
  4745.     {
  4746.         Results[0] = RC_ERROR;
  4747.         Results[1] = TERMERROR_UNKNOWN_OBJECT;
  4748.     }
  4749.     else
  4750.     {
  4751.         if(AttributeTable[Index] . ReadOnly)
  4752.         {
  4753.             Results[0] = RC_ERROR;
  4754.             Results[1] = TERMERROR_INFORMATION_IS_READ_ONLY;
  4755.         }
  4756.         else
  4757.         {
  4758.             UBYTE DstName[160];
  4759.  
  4760.             if(AttributeTable[Index] . Type == INFO_STEM)
  4761.             {
  4762.                 if(!Args[ARG_SETATTR_STEM])
  4763.                 {
  4764.                     Results[0] = RC_ERROR;
  4765.                     Results[1] = TERMERROR_RESULT_VARIABLE_REQUIRED;
  4766.                 }
  4767.                 else
  4768.                 {
  4769.                     UBYTE    FullName[160];
  4770.                     STRPTR    Result;
  4771.                     LONG    Level,Max,Min = 0;
  4772.  
  4773.                     strcpy(DstName,Args[ARG_SETATTR_STEM]);
  4774.  
  4775.                     Level = AttributeTable[Index] . Level;
  4776.  
  4777.                     do
  4778.                     {
  4779.                         if(AttributeTable[Index] . Name)
  4780.                         {
  4781.                             if(!AttributeTable[Index + 1] . Name)
  4782.                             {
  4783.                                 if(AttributeTable[Index] . Type == INFO_STEM)
  4784.                                 {
  4785.                                         /* Special cases! */
  4786.  
  4787.                                     switch(AttributeTable[Index] . NodeID)
  4788.                                     {
  4789.                                         case ATTR_PREFS_TRANSLATIONS:
  4790.  
  4791.                                             Max = 256;
  4792.                                             break;
  4793.  
  4794.                                         case ATTR_PREFS_FUNCTIONKEYS:
  4795.                                         case ATTR_PREFS_FUNCTIONKEYS_SHIFT:
  4796.                                         case ATTR_PREFS_FUNCTIONKEYS_ALT:
  4797.                                         case ATTR_PREFS_FUNCTIONKEYS_CONTROL:
  4798.  
  4799.                                             Max = 11;
  4800.                                             Min = 1;
  4801.                                             break;
  4802.  
  4803.                                         default:
  4804.  
  4805.                                             Max = 0;
  4806.                                             break;
  4807.                                     }
  4808.                                 }
  4809.                                 else
  4810.                                     Max = 0;
  4811.  
  4812.                                 if(!Max)
  4813.                                 {
  4814.                                     Forbid();
  4815.  
  4816.                                     if(Results[1] = GetSingleAttribute(AttributeTable[Index] . NodeID,Index,Count1,&Result))
  4817.                                     {
  4818.                                         Permit();
  4819.  
  4820.                                         Results[0] = RC_ERROR;
  4821.  
  4822.                                         break;
  4823.                                     }
  4824.                                     else
  4825.                                         Max = Atol(Result);
  4826.  
  4827.                                     Permit();
  4828.                                 }
  4829.                             }
  4830.  
  4831.                             if(AttributeTable[Index] . Type != INFO_STEM)
  4832.                             {
  4833.                                 SPrintf(FullName,"%s.%s",DstName,FromIndex(Index,Count1,0,FALSE));
  4834.  
  4835.                                 if(!GetRexxVar(Pkt -> RexxMsg,FullName,&Result))
  4836.                                 {
  4837.                                     if(Results[1] = SetSingleAttribute(AttributeTable[Index] . NodeID,Index,Count1,Result))
  4838.                                     {
  4839.                                         Results[0] = RC_ERROR;
  4840.  
  4841.                                         break;
  4842.                                     }
  4843.                                 }
  4844.                                 else
  4845.                                     Results[0] = RC_ERROR;
  4846.                             }
  4847.                         }
  4848.                         else
  4849.                         {
  4850.                             LONG i,j;
  4851.  
  4852.                             for(i = Min ; i < Max ; i++)
  4853.                             {
  4854.                                 j = 0;
  4855.  
  4856.                                 do
  4857.                                 {
  4858.                                     if(AttributeTable[Index + j] . Type != INFO_STEM)
  4859.                                     {
  4860.                                         SPrintf(FullName,"%s.%s",DstName,FromIndex(Index + j,i,0,FALSE));
  4861.  
  4862.                                         if(!GetRexxVar(Pkt -> RexxMsg,FullName,&Result))
  4863.                                         {
  4864.                                             if(Results[1] = SetSingleAttribute(AttributeTable[Index + j] . NodeID,Index + j,i,Result))
  4865.                                             {
  4866.                                                 Results[0] = RC_ERROR;
  4867.  
  4868.                                                 break;
  4869.                                             }
  4870.                                         }
  4871.                                         else
  4872.                                             Results[0] = RC_ERROR;
  4873.                                     }
  4874.  
  4875.                                     j++;
  4876.                                 }
  4877.                                 while(AttributeTable[Index + j] . Level > Level && !Results[0]);
  4878.                             }
  4879.  
  4880.                             while(AttributeTable[Index + 1] . Level > Level)
  4881.                                 Index++;
  4882.  
  4883.                             Min = 0;
  4884.  
  4885.                             if(Results[0])
  4886.                                 break;
  4887.                         }
  4888.  
  4889.                         Index++;
  4890.                     }
  4891.                     while(Index < AttributeTableSize && AttributeTable[Index] . Level > Level);
  4892.                 }
  4893.             }
  4894.             else
  4895.             {
  4896.                 STRPTR Result;
  4897.  
  4898.                 if(Args[ARG_SETATTR_STEM])
  4899.                 {
  4900.                     SPrintf(DstName,"%s.%s",Args[ARG_SETATTR_STEM],SrcName);
  4901.  
  4902.                     if(!GetRexxVar(Pkt -> RexxMsg,DstName,&Result))
  4903.                     {
  4904.                         if(Results[1] = SetSingleAttribute(AttributeTable[Index] . NodeID,Index,Count1,Result))
  4905.                             Results[0] = RC_ERROR;
  4906.                     }
  4907.                     else
  4908.                         Results[0] = RC_ERROR;
  4909.                 }
  4910.                 else
  4911.                 {
  4912.                     if(Results[1] = SetSingleAttribute(AttributeTable[Index] . NodeID,Index,Count1,Args[ARG_SETATTR_VAR]))
  4913.                         Results[0] = RC_ERROR;
  4914.                 }
  4915.             }
  4916.         }
  4917.     }
  4918.  
  4919.     return(NULL);
  4920. }
  4921.